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 относительно того, что происходит.

Author: delatbabel, 2015-04-09

1 answers

Я думаю, что нашел ответ после долгой отладки командной строки (с использованием phpstorm):

Функция обработки маршрута ПОСЛЕ регистрации в контроллере была объявлена следующим образом:

public function postRegister(RegistrationRequest $request)
{

... требуется, чтобы экземпляр запроса передавался посредством внедрения зависимостей. Этот запрос содержал некоторый код проверки, и если по какой-либо причине код проверки не может быть завершен (например, создает исключение), то функция контроллера никогда не вызывается - потому что построение запрос не выполняется.

Это в области браузера выдает ошибку 500, но в области кодирования исключение перехватывается по-другому и возвращает перенаправление на /без данных. Все это происходит вне функции контроллера, а не внутри нее, так что оператор Log в функции контроллера никогда не выполняется, потому что функция никогда не вызывается. Обработчик исключений в codeception является общей ловушкой.

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

 6
Author: delatbabel, 2015-04-16 07:06:33