Laravel 5.7: предотвращение автоматической загрузки в конструкторе контроллера

#laravel-5

#laravel-5

Вопрос:

У меня есть HomeController с его конструктором, который принимает экземпляр Guzzle.

    /**
     * Create a new controller instance.
     *
     * @param GuzzleHttpClient|null $client
     *
     * @return void
     */
    public function __construct(Client $client = null)
    {
        $this->middleware('auth');
        $this->middleware('user.settings');
        if ($client === null) {
            $param = [
                'base_uri' => 'http://httpbin.org/',
                'defaults' => [
                    'exceptions' => false,
                    'verify' => false
                ]
            ];
            $client = new Client($param);
        }
        $this->setClient($client);
    }
  

Я бы использовал via __constructor(), чтобы иметь возможность имитировать это в тестах.
Мои проблемы в том, что Laravel автоматически загружает инъекцию, а введенный клиент Guzzle имеет пустые значения по умолчанию (и больше не может его редактировать). Другими словами: при первом вызове HomeController Client значение not равно null. И мне нужно значение null.

Как я могу остановить это поведение (только для __construct() для HomeController)? Я действительно использую DI в каждой части моего веб-приложения.

Редактировать

Я просто обнаружил, что если я не набираю подсказки Client , конечно, Laravel не сможет автоматически загружаться. Правильный ли это режим для работы?

Новый конструктор:

public function __construct($client = null)

Спасибо

Ответ №1:

У меня была похожая ситуация при тестировании API. В итоге я привязал экземпляр GuzzleClient к контейнеру сервиса (см. документацию). Что-то вроде:

 $this->app->instance('GuzzleHttpClient', new MockClient);
  

Чтобы успешно имитировать экземпляр, я затем проверил, имеет ли он определенное значение свойства (в моем случае base_url установлено). Это определяло, был ли экземпляр тестовым, как base_url было бы установлено.

Наряду с этим методом GuzzleHttpClient есть макет-обработчик, который вы, возможно, захотите изучить. Это может быть использовано для подделки тел ответов, заголовков и кодов состояния.

Комментарии:

1. Спасибо. Я знаю о MockHandler (и я его использую). Кстати, я думаю, что я нашел свое решение: просто не ввод текста заканчивается без автоматического разрешения из Laravel…

2. @sineverba Это помогло бы. В итоге я создал новый класс, который заменил Guzzle DI. У меня была веская причина, поскольку я использовал класс-оболочку, который помог мне просто поменять экземпляр при загрузке. Также была очищена конструкция.