Laravel 5 /Неверная маршрутизация при приеме кода
Я пытаюсь написать тестовый пример API для функции контроллера с использованием кодирования, и я сталкиваюсь с проблемой, когда маршрут к функции контроллера, по-видимому, оценивается неправильно, и оценка, похоже, отличается в зависимости от того, что у меня есть в моем тестовом случае.
Вот пример кода из моего тестового примера:
use \ApiTester;
class CustomerRegisterCest
{
// tests
public function testGetRegister(ApiTester $I)
{
$I->sendGET('register');
$I->seeResponseCodeIs(200);
}
public function testPostRegister(ApiTester $I)
{
$I->sendPOST('register', [
// set the data in here
]);
$I->seeResponseCodeIs(200);
}
У меня есть routes.php файл, содержащий эти маршруты:
Route::get('/', ['as' => 'home', 'uses' => 'HomeController@getIndex']);
Route::get('register', ['as' => 'getRegister', 'uses' =>'RegistrationController@getRegister']);
Route::post('register', ['as' => 'postRegister', 'uses' => 'RegistrationController@postRegister']);
Я вставил некоторые инструкции отладки в свои классы контроллеров, так что что я могу видеть, какие маршруты выполняются, например:
Log::debug('GET register'); // or GET index or POST register, etc
На данный момент я удалил все из своих классов контроллеров, так что включены ТОЛЬКО инструкции отладки.
Когда я запускаю тестовый случай, как указано выше, я получаю следующий отладочный вывод:
GET register
GET index
... таким образом, похоже, что sendPOST ("регистрация", ...) на самом деле направляется на маршрут ПОЛУЧЕНИЯ для "/" вместо маршрута отправки для "/регистрация". За пределами тестового случая все работает нормально - я могу ОТПРАВИТЬ СООБЩЕНИЕ в реестр маршруты в порядке, маршрутизация, похоже, работает нормально, проблема возникает только в тестовом случае кодирования.
Если я изменю тестовый случай так, чтобы я выполнял отправку и отправку внутри одного и того же вызова функции, например, так:
// tests
public function testPostRegister(ApiTester $I)
{
$I->sendGET('register');
$I->seeResponseCodeIs(200);
$I->sendPOST('register', [
// set the data in here
]);
$I->seeResponseCodeIs(200);
}
Затем я вижу этот отладочный вывод:
GET register
GET register
... таким образом, вставив sendGET в ту же функцию, что и sendPOST, он изменил поведение sendPOST, так что теперь он направляется к маршруту GET для регистрации вместо маршрута GET для индекс (но все равно не будет перенаправляться на правильный почтовый маршрут).
Я попытался включить xdebug, и у меня также нет никаких подсказок из вывода xdebug относительно того, что происходит.
1 answers
Я думаю, что нашел ответ после долгой отладки командной строки (с использованием phpstorm):
Функция обработки маршрута ПОСЛЕ регистрации в контроллере была объявлена следующим образом:
public function postRegister(RegistrationRequest $request)
{
... требуется, чтобы экземпляр запроса передавался посредством внедрения зависимостей. Этот запрос содержал некоторый код проверки, и если по какой-либо причине код проверки не может быть завершен (например, создает исключение), то функция контроллера никогда не вызывается - потому что построение запрос не выполняется.
Это в области браузера выдает ошибку 500, но в области кодирования исключение перехватывается по-другому и возвращает перенаправление на /без данных. Все это происходит вне функции контроллера, а не внутри нее, так что оператор Log в функции контроллера никогда не выполняется, потому что функция никогда не вызывается. Обработчик исключений в codeception является общей ловушкой.
Неявное предположение состоит в том, что, возможно, инъекции зависимостей в контроллерах это плохая идея. Или, может быть, что универсальные обработчики исключений - плохая идея.