Как получить текущий контроллер при загрузке или регистрации в Laravel 5.2 Service Provider?
У меня маленькая проблема на руках. Мне не удается получить текущее имя контроллера из запроса в сервис-провайдере.
Я хочу динамически предоставить другой репозиторий, напечатав один и тот же интерфейс на основе контроллера, в котором я сейчас нахожусь.
Мой текущий поставщик услуг выглядит примерно так, но request()->route() возвращает null.
private $currentController;
private static $controllerBindings = [
'FooController' => ['RepositoryInterface' => 'FooRepository'],
];
private static $bindings = [
'SomeInterface' => 'SomeRepository'
];
public function boot()
{
$controller = request()->route()->getAction()['controller'];
$controller = preg_replace('/@[a-zA-Z0-9]+/', '', $controller);
$this->currentController = $controller;
}
public function register()
{
if ( array_key_exists($this->currentController, self::$controllerBindings) ) {
foreach (self::$controllerBindings[$this->currentController] as $interface => $dependency) {
app()->bind($interface, $dependency);
}
}
else {
foreach (self::$bindings as $interface => $dependency) {
app()->bind($interface, $dependency);
}
}
}
Я попытался сделать это, и это дает: BindingResolutionException в строке Container.php 748: Цель [App\Business\Interfaces\RepositoryInterface] не создается при сборке [App\Http\Controllers\Admin\SettingsController].
private static $bindings = [
'App\Http\Controllers\SettingsController' => [
'App\Business\Interfaces\RepositoryInterface' => 'App\Business\Admin\Repositories\SettingsRepository',
],
];
public function boot()
{
}
public function register()
{
foreach (self::$bindings as $entity => $binding) {
if ( is_array($binding) ) {
$this->bindEntityFromArray($entity, $binding);
}
else {
app()->bind($entity, $binding);
}
}
}
private function bindEntityFromArray($entity, array $bindings)
{
foreach ($bindings as $interface => $dependency) {
app()->when($entity)->needs($interface)->give($dependency);
}
}
Я вставляю RepositoryInterface в конструктор контроллера.