Объявите один и тот же маршрут дважды, но ожидайте другого поведения в соответствии с промежуточным ПО - PullRequest
2 голосов
/ 30 апреля 2020

Я начал создавать REST API с использованием инфраструктуры lumen и хотел настроить определенное поведение для моего GET /user маршрута. Поведение выглядит следующим образом:

  • Если запрос поступил от аутентифицированного пользователя (с использованием промежуточного программного обеспечения auth), вызывается метод getAllFields из UserController и возвращаются все данные из user
  • Если это не так, вызывается метод get из UserController и возвращаются некоторые данные из user

Кажется, лог c мне просто написать это в моем web.php, используя простое промежуточное ПО:

<?php

$router->group(['middleware' => 'auth'], function () use ($router) {
    $router->get('/user/{id}',  [
        'uses' => 'UserController@getAllFields'
    ]);
});

$router->get('/user/{id}',  [
    'uses' => 'UserController@get'
]);

Но по какой-то причине, даже если промежуточное ПО корректно, я всегда получаю ответ от второго объявления маршрута ( этот звонок get()). Я уточняю, что если я удаляю второе объявление маршрута, оно в промежуточном программном обеспечении работает как положено.

У кого-нибудь есть идеи, как мне добиться чего-то похожего, что работает?

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Маршрутизатор проверит, соответствует ли ваш запрос какому-либо объявленному маршруту. Промежуточное программное обеспечение будет работать ПОСЛЕ того совпадения, поэтому вы не можете просто вернуться к маршрутизатору и попытаться найти другое совпадение.

Следовать Laravel и шаблону маршрутов - у вас должен быть один маршрут, который будет указывать на метод внутри контроллера. Затем внутри этого Вы можете проверить, вошел ли пользователь в систему или нет, и выполнить getAllFields () с этого контроллера. Переписывать его будет не так уж и много, поскольку вы все равно используете UserController на обоих маршрутах.

web. php

$router->get('/user/{id}', 'UserController@get');

UserController. php

public function get()
{
   return auth()->check() ? YourMethodForLogged() : YourMethodForNotLogged();
}

Или, если логи не так много c Вы можете сохранить это одним способом.

Также будет хорошей идеей следовать стандартам REST Laravels (так используйте show вместо get, «users» вместо «user» et c - подробнее https://laravel.com/docs/7.x/controllers)

web. php

$router->get('/users/{user}', 'UserController@show');

UserController. php

public function show(User $user)
{
   if (auth()->check()) {
      //
   } else {
      //
   }
}

Подводя итог - для ваших нужд используйте аутентификацию внутри контроллера вместо промежуточного программного обеспечения. Чтобы проверить, вошел ли пользователь в систему, вы можете использовать Facade Auth :: check () или вспомогательный auth () -> check (), или напротив Auth :: guest () или auth () -> guest ().

Если вы на самом деле используете Lumen вместо полного Laravel, то по умолчанию нет вспомогательного помощника (вы можете создать собственный пакет или использовать его как lumen-helpers) или просто оставить его простым и использовать вместо него только фасады ( если вы затем включили в люмен).

Подробнее https://laravel.com/docs/7.x/authentication и https://lumen.laravel.com/docs/7.x/authentication

0 голосов
/ 30 апреля 2020

Этот шаблон противоречит идее маршрутизации Laravel. Каждый маршрут должен быть определен один раз.

Вы можете определить свой маршрут без включенного промежуточного программного обеспечения auth, а затем определить свою логи c в контроллере.

...