Я использую Laravel 5.2 и имею проблему с промежуточным программным обеспечением. Есть код в route.php
использовать Illuminate \ Contracts \ Auth \ Access \ Gate;
Route :: group (['middleware' => 'web'], function () {
Route :: Auth ();
Маршрут :: get ('/', 'HomeController @ index');
});
Route :: group (['prefix' => 'admin', 'middleware' => 'admin'], function () {
Маршрут :: get ('/', function () {
return view ('admin.index');
});
Маршрут :: get ('/ user', function () {
return view ('admin.user');
});
});
Kernel.php:
protected $ routeMiddleware = [
...
'admin' => \ App \ Http \ Middleware \ AdminPanel :: класс,
];
AdminPanel.php
пространство имен App \ Http \ Middleware;
использование Закрытие;
используйте Illuminate \ Support \ Facades \ Auth;
использовать App \ Role;
класс AdminPanel
{
дескриптор публичной функции ($ request, Closure $ next)
{
$ user = Auth :: user ();
дд ($ пользователю);
если ($ пользователю) {
$ role = Role :: whereName ('admin') -> first ();
если ($ user-> hasRole ($ роль)) {
return $ next ($ request);
}
}
return redirect ('/');
}
Так,
$user = Auth::user ()
всегда возвращать null. Спасибо за предложения!
Любой маршрут, использующий Auth() должен быть инкапсулирован в промежуточное программное обеспечение. Вы близки, просто переместите свою 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 в конструкторе контроллера.
Я понял, что вы не можете получить доступ к аутентифицированному пользователю в конструкторе вашего контроллера, потому что промежуточное программное обеспечение еще не запущено.
В качестве альтернативы вы можете определить промежуточное ПО, основанное на Closure, непосредственно в конструкторе вашего контроллера.
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); }); } }