Auth::user() возвращает null в модуле __construct()

Я создал новый модуль с именем Article, используя модули laravel. Для некоторых внутренних маршрутов требовалась аутентификация, и я добавил промежуточное ПО auth и дополнительное разрешение view_backend. Я использую пакет https://github.com/spatie/laravel-permission для роли- разрешения.

проблема в том, что когда я пытаюсь получить доступ к маршруту admin/article/posts, он предлагает мне войти в систему, как и ожидалось. Но после входа в систему он показывает нуль в методе __construct() для Auth::user();

Я добавил промежуточное ПО web, как указано в #204, но это не решило проблему. . Не могли бы вы помочь мне решить эту проблему? Мой проект работает на Laravel 5.6 и использует последнюю версию Laravel-Modules.

Route::group(['namespace' => 'Modules\Article\Http\Controllers\Backend', 'as' => 'backend.article.', 'middleware' => ['web', 'auth', 'can:view_backend'], 'prefix' => 'admin/article'], function () {

    Route::resource("posts", "PostsController");
});

Мой проект размещен на Github, https://github.com/nasirkhan/laravel-starter/tree/module


person nasirkhan    schedule 21.06.2018    source источник


Ответы (2)


Прежде всего, добавьте в ядро ​​Spatie Middleware:

protected $routeMiddleware = [
    // ...
    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
];

Затем в вашем контроллере проверьте наличие разрешений или ролей:

public function __construct(Request $request)
    {
        $this->middleware(['permission: order.index']);
    }

Теперь вы можете получить доступ к своей аутентификации с помощью $request->user(), например:

public function create(Request $request)
    {
        if ($request->user()->hasRole('admin')) {

           // return view("carmodel.create", ["manufacturers"=>$manufacturers]);
        } else {
            return view("admin.error", ['code'=>'001','msg'=>'err']);
        }
    }
person Payam Khaninejad    schedule 21.06.2018

Согласно документам:

В предыдущих версиях Laravel вы могли получить доступ к переменным сеанса или аутентифицированному пользователю в конструкторе вашего контроллера. Это никогда не предназначалось для явной функции фреймворка. В Laravel 5.3 вы не можете получить доступ к сеансу или аутентифицированному пользователю в конструкторе вашего контроллера, потому что промежуточное ПО еще не запущено.

В качестве альтернативы вы можете определить промежуточное ПО на основе Closure непосредственно в конструкторе вашего контроллера. Прежде чем использовать эту функцию, убедитесь, что ваше приложение работает под управлением Laravel 5.3.4 или выше:

public function __construct()
{
    $this->middleware(function ($request, $next) {
        $this->projects = Auth::user()->projects;

        return $next($request);
    });
}

Или вы можете указать это:

public function index(Request $request)
{
    $projects = $request->user()->projects;

    $value = $request->session()->get('key');
}

Документы

person Remul    schedule 21.06.2018