Laravel изменить привязку с параметрами запроса - PullRequest
0 голосов
/ 14 июня 2019

Я использую Laravel Framework 5.8.21. Я пытаюсь связать interface с классом, основанным на Request параметрах внутри AppServiceProvider * * * * * * * * * метода, подобного этому.

public function register()
{
  $this->app->bind('App\Contracts\SomeInterface', 'App\Logic\ClassName');
  if(Request::has('notification_type') && Request::get('notification_type') == 'email') {
    $this->app->bind('App\Contracts\SomeInterface', 'App\Logic\SomeotherClassName');
  }
}

и позже вводит интерфейс для метода Controller s __construct().

с тестами, он всегда привязан к ClassName. Я пытался получить доступ к URL-адресу внутри AppServiceProvider, и при запуске unit tests он всегда возвращал / с $this->app->request->getRequestUri(); и методом как GET, хотя из теста, который я отправляю на URL-адрес, вот так.

$this->post('/notification', [
            'notification_type' => 'email',
  ])->assertJson(   
     'message-push-status' => true,
  ]);

При тестировании с Почтальоном, когда я пытаюсь опубликовать http://localhost:8000/notification, он говорит, 419 | Page Expired.

1 Ответ

0 голосов
/ 15 июня 2019

Вы не сможете надежно использовать информацию о текущем запросе у поставщика услуг.

Во-первых, в общем случае рекомендуется не зависеть от логики приложения в методе register() напрямую. Вы можете вызвать состояние гонки, когда у вас есть зависимость, которая еще не была зарегистрирована, или вызвать ненужные накладные расходы (например, установить соединение с базой данных, даже если вам не нужны запросы).

Во-вторых, Жизненный цикл запроса Laravel не будет направлять текущий запрос в приложение до тех пор, пока после не будет завершена вся регистрация и начальная загрузка поставщика услуг.

Не зная точно, какую бизнес-логику вы пытаетесь выполнить, у вас есть по крайней мере пара вариантов:

  1. Используйте контекстную привязку для обслуживания различных реализаций одного и того же интерфейса в зависимости от запрашивающего объекта (например, контроллера).

  2. Используйте фабричный или аналогичный объект в стиле фасилитатора, который вы можете внедрить в контроллер, и может обеспечить правильную зависимость в зависимости от предпочитаемой вами логики.

...