Can't call Auth::user() on controller's constructor

后端 未结 3 1421
情书的邮戳
情书的邮戳 2020-11-28 13:49

I\'m trying to check if the user has permission to a certain model. Up until now (with Laravel 5.2), I added this code at the constructor:

public function __         


        
相关标签:
3条回答
  • 2020-11-28 14:20

    See here:

    Session In The Constructor

    In previous versions of Laravel, you could access session variables or the authenticated user in your controller's constructor. This was never intended to be an explicit feature of the framework. In Laravel 5.3, you can't access the session or authenticated user in your controller's constructor because the middleware has not run yet.

    As an alternative, you may define a Closure based middleware directly in your controller's constructor. Before using this feature, make sure that your application is running Laravel 5.3.4 or above:

    <?php
    
    namespace App\Http\Controllers;
    
    use App\User;
    use Illuminate\Support\Facades\Auth;
    use App\Http\Controllers\Controller;
    
    class ProjectController extends Controller
    {
        /**
         * All of the current user's projects.
         */
        protected $projects;
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware(function ($request, $next) {
                $this->projects = Auth::user()->projects;
    
                return $next($request);
            });
        }
    }
    

    Of course, you may also access the request session data or authenticated user by type-hinting the Illuminate\Http\Request class on your controller action:

    /**
     * Show all of the projects for the current user.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return Response
     */
    public function index(Request $request)
    {
        $projects = $request->user()->projects;
    
        $value = $request->session()->get('key');
    
        //
    }
    
    0 讨论(0)
  • 2020-11-28 14:27

    Because you're attempting to access the instance before the middleware even fires. You can use request()->user() instead.

    0 讨论(0)
  • 2020-11-28 14:31
    class StudentController extends Controller
    {
    
        public $role;
    
        public function __construct()
        {
            $this->middleware(function ($request, $next) {  
            if (!Auth::user()->hasPermission('usergroups')) {
                abort(404);
            }
                return $next($request);
            });
        }
    }
    

    Hope help you!!!

    Update: Get your code inside

    $this->middleware(function ($request, $next) {
    //your code
    return $next($request);
    });
    
    0 讨论(0)
提交回复
热议问题