Я использую 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); }); } }