web-dev-qa-db-fra.com

Auth :: user () retourne null

J'utilise Laravel 5.2 et j'ai un problème avec le middleware. Il y a le code dans routes.php

 
 utilisez Illuminate\Contracts\Auth\Access\Gate; 
 
 
 Route :: group (['middleware' => 'web' ], fonction () {
 
 Route :: auth (); 
 
 Route :: get ('/', 'HomeController @ index'); 
}); 
 
 
 Route :: group (['prefix' => 'admin', 'middleware' => 'admin'], function () {
 Route :: get ('/', function () {
 Return view ('admin.index'); 
}); 
 Route :: get ('/ user', function () {
 return view ('admin.user'); 
}); 
}); 
 

Kernel.php:

 
 protégé $ routeMiddleware = 
 ... 
 'admin' =>\App\Http\Middleware\AdminPanel :: class, 
; 
 

AdminPanel.php

 
 espace de noms App\Http\Middleware; 
 
 
 utiliser Closure; 
 utiliser Illuminate\Support\Facades\Auth; 
 utilisez App\Role; 
 
 classe AdminPanel 
 {
 handle de fonction publique ($ request, Closure $ next) 
 {
 $ user = Auth :: user (); 
 dd ($ user); 
 
 if ($ user) {
 $ role = Role :: whereName ('admin') -> first (); 
 if ($ user-> hasRole ($ role)) {
 return $ next ($ request); 
 } 
} 
 retourne la redirection ('/');;.____.]} 
 

Donc,

$user = Auth::user ()
17
imladris

Toute route qui utilise Auth() doit être encapsulée dans le middleware web. Vous êtes proche, déplacez simplement votre Route::group(['prefix' => 'admin'], ...) dans le groupe ci-dessus.

Route::group(['middleware' => 'web'], function () {

    Route::auth();

    Route::get('/', 'HomeController@index');

    // Moving here will ensure that sessions, csrf, etc. is included in all these routes
    Route::group(['prefix'=>'admin',  'middleware' => 'admin'], function(){
        Route::get('/', function(){
            return view('admin.index');
        });

        Route::get('/user', function(){
            return view('admin.user');
        });
    });
});
29
camelCase

J'ai fait face à une situation où Auth::user() renvoie toujours null, c'est parce que j'essayais d'obtenir le User dans le constructeur d'un contrôleur.

J'ai réalisé que vous ne pouvez pas accéder à l'utilisateur authentifié dans le constructeur de votre contrôleur car le middleware n'a pas encore été exécuté.

Comme alternative, vous pouvez définir un middleware basé sur Closure directement dans le constructeur de votre contrôleur.

namespace App\Http\Controllers;

use App\User;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class ProjectController extends Controller
{
    protected $user;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(function ($request, $next) {

            $this->user = Auth::user();

            return $next($request);
        });
    }
}
32
Hemerson Varela