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
()
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');
});
});
});
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);
});
}
}