Как использовать внедрение зависимостей с маршрутами в laravel - PullRequest
0 голосов
/ 01 апреля 2020

Как настроить экземпляры маршрута (Illuminate/Support/Facades/Route.php) для использования уже зарегистрированных служб через DI?

Например, я регистрирую свой синглтон:

$this->app->singleton('api_controller', function ($app) {
    return new Controller('config_value');
});

И сам контроллер:

class ApiController extends Controller
{
   private $configValue;

   public function __construct(string $configValue)
   {
      $this->configValue = $configValue;
   }

   public function getConfigValue()
   {
       return $this->configValue;
   }
}

Затем объявляем маршрут:

Route::get('config-value', 'ApiController@getConfigValue')->name('getConfigValue');

Но после вызова API Route инициирует новый экземпляр ApiController, а не тот, который я объявил как singleton, поэтому config_value не передается контроллеру. Можно ли настроить экземпляры Route?

Пробовал альтернативный маршрут с экземпляром приложения, но, похоже, не находит службу api_controller:

Route::get('config-value', function () { return app('api_controller')->getConfigValue(); })->name('getConfigValue');

In Container.php line 752:

  Class api_controller does not exist

1 Ответ

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

Похоже, что единственный способ добиться этого - использовать автоматическое соединение (а не с помощью объявления идентификатора пользовательской службы, что ограничивает конфигурацию нескольких экземпляров). Также необходимо явно defer false, чтобы иметь возможность переопределять новые экземпляры.

protected $defer = false;
$this->app->singleton(Controller::class, function ($app) {
    return new Controller('config_value');
});
...