#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. У меня была веская причина, поскольку я использовал класс-оболочку, который помог мне просто поменять экземпляр при загрузке. Также была очищена конструкция.