Невозможно сделать HTTP-запрос к конечной точке Laravel - PullRequest
0 голосов
/ 10 октября 2018

У меня действительно странная проблема при попытке сделать HTTP-запрос в одном из моих тестов.Мой api.php файл маршрутов выглядит следующим образом:

$router->group(['prefix' => '/v1', 'middleware' => ['auth:api']], 
    function (\Illuminate\Routing\Router $router) {
        $router->apiResource('/contacts', 'ContactsController');

        $router->group(['prefix' => '/contacts'], 
            function (\Illuminate\Routing\Router $router) {
                $router->apiResource('/groups', 'Contacts\\GroupsController');
        });
});

Запуск php artisan route:list показывает следующий маршрут как зарегистрированный

+------------+------------------------+--------------+------------------------------------------------------+----------------+
|   Method   |           URI          |      Name    |                        Action                        |   Middleware   |
+------------+------------------------+--------------+------------------------------------------------------+----------------+
| GET|HEAD   | api/v1/contacts/groups | groups.index | App\Http\Controllers\Contacts\GroupsController@index |  api auth:api  |
+------------+------------------------+--------------+------------------------------------------------------+----------------+

Однако, когда я запускаю свой тест, я получаю 404ответ.Тест выглядит следующим образом:

public function testICanGetAllOfTheGroups()
{
    factory(Group::class)->times(3)->create();

    $this->json('GET', '/api/v1/contacts/groups')
            ->assertStatus(200)->assertJsonCount(3);
}

Я также пытался запустить php artisan route:clear и php artisan cache:clear, но это не имело значения.

Для аутентификации я создал следующеечерта, которую я использую.

trait Authenticated
{
    /** @var \App\Models\User */
    protected $user;

    public function setUp()
    {
        parent::setUp();

        $this->user = factory(User::class)->create();
        Passport::actingAs($this->user);
    }
}

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Я, кажется, понял это.Если я переставлю маршруты с

$router->group(['prefix' => '/v1', 'middleware' => ['auth:api']], function (\Illuminate\Routing\Router $router) {
    $router->apiResource('/contacts', 'ContactsController');

    $router->group(['prefix' => '/contacts'], function (\Illuminate\Routing\Router $router) {
        $router->apiResource('/groups', 'Contacts\\GroupsController');
    });
});

до

$router->group(['prefix' => '/v1', 'middleware' => ['auth:api']], function (\Illuminate\Routing\Router $router) {
    $router->group(['prefix' => '/contacts'], function (\Illuminate\Routing\Router $router) {
        $router->apiResource('/groups', 'Contacts\\GroupsController');
    });

    $router->apiResource('/contacts', 'ContactsController');
});

, тогда это сработает.Я подозреваю, что это ошибка в том, как Laravel регистрирует свои маршруты как POST и PUT запросы по-прежнему работают нормально.

Я поднял это как ошибку на GitHub - https://github.com/laravel/framework/issues/26038


ОБНОВЛЕНИЕ

Теперь я определил проблему.В основном apiResource переводит одну из конечных точек в:

/contacts/{contact}.

Следуя этому маршруту, contacts/groups.Однако для того, чтобы Laravel сопоставил его с contacts/groups, он должен быть до /contacts/{contact}, так как это подстановочный знак.Независимо от того, является ли это преднамеренным поведением, я не уверен, но в настоящий момент просто наличие маршрутов наоборот исправляет это.

0 голосов
/ 10 октября 2018

почему вы не включили оба маршрута в группу contacts?

$router->group(['prefix' => '/v1', 'middleware' => ['auth:api']], function (\Illuminate\Routing\Router $router) {
    $router->group(['prefix' => '/contacts'], function (\Illuminate\Routing\Router $router) {
        $router->apiResource('/', 'ContactsController');
        $router->apiResource('/groups', 'Contacts\\GroupsController');
    });
});
0 голосов
/ 10 октября 2018

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

$this->actingAs(User $user); 

.

Ссылка: Документы Laravel

Ваш код должен работать следующим образом:

public function testICanGetAllOfTheGroups()
{
    factory(Group::class)->times(3)->create();
    $user = factory(User::class)->create();  // Create user for authentication
    this->actingAs($user)                  // Pass user to the request
        ->json('GET', '/api/v1/contacts/groups')->assertStatus(200)->assertJsonCount(3);
}

Надеюсь, это вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...