Laravel 5.6 - получить аутентифицированного пользователя вне контроллера без промежуточного ПО - PullRequest
0 голосов
/ 28 июня 2018

Длинное название. У меня есть синглтон, который можно инициализировать в произвольной точке. Он может быть вызван во время конструктора контроллера, поэтому я не могу использовать промежуточное программное обеспечение для аутентификации, поскольку оно может не быть построено.

Мне нужно откуда-то получить пользователя, но я не могу найти способ сделать это. Сеанс, запрос или промежуточное программное обеспечение не гарантированно существуют или инициализируются. Я проверил фасады и ничего.

Я уверен, что есть способ понять это. Может быть, кто-то более изобретательный, чем я.

1 Ответ

0 голосов
/ 28 июня 2018

После трассировки по коду вот проблема:

Контроллер получает конвейер через маршрутизатор, и порядок выглядит следующим образом:

-> запустить контроллер __construct ()

-> затем пропустите его через конвейер и запустите промежуточное ПО в порядке важности

-> затем выполнять другие операции (например, вызывать index () или любую точку входа, необходимую для маршрута)

Промежуточное программное обеспечение - это то, что обрабатывает сессии, запросы, аутентификацию и т. Д. Все промежуточное ПО работает между контроллером __construct и точкой входа.

Итак, в контроллере, если вам нужно сделать что-то вроде:

__construct() {
    $this->middleware(function(Request $request, $next) {
       echo 'step 1';
    });

    echo 'step 2';

}

public function index() { echo 'step 3'; }

Вы получите:

шаг 2 <--- внутри области __construct (все, что определено в обратном вызове промежуточного программного обеспечения, здесь недоступно). </p>

шаг 1 <- вне области видимости __construct (но до области видимости index ()) </p>

шаг 3 <- внутри индекса, все, что определено в шаге 1, доступно здесь. </p>

Таким образом, все, что требует их, гарантированно существует до того, как это потребуется в функциях точки входа, но не внутри конструктора, если только оно не помещено в обратный вызов промежуточного программного обеспечения. Поэтому лучшее, что вы можете сделать, - это запустить код в этом «промежуточном» состоянии. В конце концов, сделав его доступным, когда вам это нужно. Здесь есть ограничение, вы можете обойти его, но это довольно раздражает.

Я не могу найти способ получить пользовательский сеанс до этого момента, я предполагаю, что вам придется прочитать его из redis и как-то разрешить его самостоятельно, поскольку объекты laravel еще не заполнены, так как это слишком рано в конвейере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...