Как получить текущий контроллер при загрузке или регистрации в 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 в конструктор контроллера.

0 ответов

Другие вопросы по тегам