Избавьтесь от всех перенаправлений и «не-API» поведения в Laravel 5.8 - PullRequest
0 голосов
/ 31 марта 2019

В настоящее время я сталкиваюсь с некоторыми проблемами при использовании Laravel в качестве бэкэнда только для API.Я хочу разрабатывать интерфейс отдельно и поэтому рассматривать Laravel только как API.У меня есть проблемы при написании тестов.Я все еще использую группу веб-промежуточного программного обеспечения (не API), и при использовании промежуточного программного обеспечения auth все работает, например, при тестировании с почтальоном, но при написании теста.

Пример

public function search_competitions_unauthorized ()
{
    $response = $this->get('/competitions/ABCDEFG');

    $response->assertStatus(401);
}

Конечная точка /competitions/ABCDEFG защищена промежуточным программным обеспечением для аутентификации.

Я получаю код ответа 500, потому что нет маршрута с определенным именем login.Это легко решить (создать маршрут с именем входа в систему), но я хочу, чтобы Laravel обрабатывал каждый запрос как запрос API, не имеющий перенаправлений.

Я пытался несколько вещей, чтобы избавиться отэто поведение.

Я определил новый класс "DefaultRequest", который расширяет Illuminate\Http\Request

class DefaultRequest extends Request
{
    public function expectsJson()
    {
        return true;
    }

    public function wantsJson()
    {
        return true;
    }
}

Я изменил index.php в общей папке.

$response = $kernel->handle(
    $request = App\Http\Requests\DefaultRequest::capture()
);

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

protected function failedValidation(Validator $validator)
{
    throw new HttpResponseException(response()->json($validator->errors(), 422));
}

У меня такое ощущение, что это должно было быть легче разрешить.Похоже, что в целом это будет проблемой только для меня во время тестирования, и я смог установить конкретные заголовки в своих тестах.Но я хотел отключить все эти способы перенаправления, так как НИКОГДА не хочу их для проекта.

1 Ответ

0 голосов
/ 01 апреля 2019

Я решил это, поместив проверку типа запроса в app/Exceptions/Handler.php, например:

public function render($request, Exception $e)
{
    ...
    // handling unauthenticated requests
    if ($e instanceof \Illuminate\Auth\AuthenticationException) {
        if (
            $request->wantsJson() ||
            $request->expectsJson() ||
            array_get($request->route()->action, 'prefix') == 'api'
        ) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        return redirect()->route('login');
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...