web-dev-qa-db-ja.com

Auth :: user()はnullを返します

Laravel 5.2を使用していますが、ミドルウェアに問題があります。routes.phpにコードがあります

 
 Illuminate\Contracts\Auth\Access\Gateを使用します; 
 
 
 Route :: group(['middleware' => 'web' ]、関数(){
 
 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:

 
 protected $ routeMiddleware = 
 ... 
 'admin' =>\App\Http\Middleware\AdminPanel :: class、
; 
 

AdminPanel.php

 
 namespace App\Http\Middleware; 
 
 
 Closureを使用; 
 Illuminate\Support\Facades\Authを使用; 
 Use App\Role; 
 
 class AdminPanel 
 {
 public function handle($ request、Closure $ next)
 {
 $ user = Auth :: user(); 
 dd($ user); 
 
 if($ user){
 $ role = Role :: whereName( 'admin')-> first(); 
 if($ user-> hasRole($ role)){
 return $ next($ request); 
 } 
} 
 return redirect( '/');
} 
 

そう、

$user = Auth::user()
17
imladris

Auth()を使用するルートは、webミドルウェアにカプセル化する必要があります。近いので、Route::group(['prefix' => 'admin'], ...)を上のグループに移動するだけです。

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

Auth::user()が常にnullを返す状況に直面しました。これは、コントローラーのコンストラクターでUserを取得しようとしたためです。

ミドルウェアがまだ実行されていないため、コントローラーのコンストラクターで認証済みユーザーにアクセスできないことに気付きました。

別の方法として、コントローラーのコンストラクターでクロージャーベースのミドルウェアを直接定義できます。

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