Свойство класса Laravel не возвращается в ответ

#php #laravel

#php #laravel

Вопрос:

Я создаю API для блога, используя Laravel, и в моем UserController для некоторых маршрутов я получаю текущего аутентифицированного пользователя, как показано ниже:

 public function getUser() {
$user = auth()->user();
return response()->json($user, 200);
}
  

Это возвращает объект json пользователя. Я получаю пользователя в других функциях таким же образом. Я хотел переместить эту строку в более широкую область, чтобы я мог получить к ней доступ во всех функциях, поэтому я поместил ее в конструктор:

     class UserController extends Controller {
        protected $user;
        public function __construct() {
          $this->user = auth()->user();
        }
      }
  

Я переработал getUser, чтобы он выглядел так;

 public function getUser() {
    return response()->json($this->user, 200);
    }
  

Теперь он просто возвращает пустой объект и код состояния 200. Почему превращение его в свойство класса больше не возвращает объект?

Комментарии:

1. Вы не можете использовать auth() в конструкторе, потому что проверка подлинности проверяется после создания контроллера

2. О, хорошо. Большое спасибо

Ответ №1:

Промежуточное программное обеспечение сеанса еще не запущено; экземпляр контроллера создается до того, как запрос проходит через стек промежуточного программного обеспечения, поэтому в этот момент у вас не будет доступа к аутентификации на основе сеанса (так auth()->user() и будет null ). Для этого можно использовать промежуточное программное обеспечение контроллера:

 class UserController extends Controller
{
    protected $user;

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

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

Это промежуточное программное обеспечение будет запущено после другого промежуточного программного обеспечения в стеке, поэтому у вас будет доступ к сеансу в этот момент.

Комментарии:

1. Для начала присвоение значения в конструкторе не требуется — даже свойство не имеет смысла. Ваш подход совсем не ошибочен, но это скорее беспорядок (основанный на вопросе), чем «чистый код».

2. Это то, о чем просит OP в своем вопросе (обсудите это с ними), я отвечаю на их конкретный вопрос, а не на какой-то общий вопрос

3. Получение ошибки в lumen 8 Illegal offset type