首页 文章

Auth :: user()在Module __construct()上返回null

提问于
浏览
1

我使用laravel-modules创建了一个名为 Article 的新模块 . 一些后端路由需要身份验证,我添加了 auth 中间件和一个额外的权限 view_backend . 我使用https://github.com/spatie/laravel-permission包作为角色权限 .

问题是当我尝试访问路由 admin/article/posts 时,它会提示我按预期登录 . 但登录后,它在 __construct() 方法上显示为 Auth::user() ;

我在#204上添加了 web 中间件,但它没有解决问题 . 你能指导我解决这个问题吗?我的项目在Laravel 5.6上,并使用最新版本的Laravel-Modules

Route::group(['namespace' => 'Modules\Article\Http\Controllers\Backend', 'as' => 'backend.article.', 'middleware' => ['web', 'auth', 'can:view_backend'], 'prefix' => 'admin/article'], function () {

    Route::resource("posts", "PostsController");
});

我的项目在Github举办,https://github.com/nasirkhan/laravel-starter/tree/module

2 回答

  • 0

    首先,将Spatie Middleware添加到您的内核:

    protected $routeMiddleware = [
        // ...
        'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
        'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
    ];
    

    然后在您的控制器中检查权限或角色:

    public function __construct(Request $request)
        {
            $this->middleware(['permission: order.index']);
        }
    

    现在,您可以使用$ request-> user()访问您的身份验证,例如:

    public function create(Request $request)
        {
            if ($request->user()->hasRole('admin')) {
    
               // return view("carmodel.create", ["manufacturers"=>$manufacturers]);
            } else {
                return view("admin.error", ['code'=>'001','msg'=>'err']);
            }
        }
    
  • 0

    根据文件:

    在以前版本的Laravel中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户 . 这从未打算成为框架的明确特征 . 在Laravel 5.3中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行 . 作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件 . 在使用此功能之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本:

    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;
    
            return $next($request);
        });
    }
    

    或者您可以输入提示:

    public function index(Request $request)
    {
        $projects = $request->user()->projects;
    
        $value = $request->session()->get('key');
    }
    

    Docs

相关问题