HTTP-тесты Laravel и атрибуты запроса

В моем приложении я добавляю атрибуты к HTTP-запросу, чтобы использовать его позже. Мое приложение является мультидоменным (.co.uk, .dk, .de). Я узнаю домен в RouteServiceProvider и добавляю обнаруженный язык в HTTP-запрос, чтобы я мог загружать данные в соответствии с языком и некоторыми другими вещами. Я узнаю и добавляю сайт прямо в RouteServiceProvider:

$website = Website::where('domain', '=', request()->getHttpHost())->first();
request()->attributes->add(['website' => $website]);

Затем в моем контроллере или где-либо еще мне просто нужно запросить запрос

if (!$request->attributes->has('website')) {
    \Log::error('Abort HTTP request: invalid website: ' . request()->getHttpHost());
    abort('500');
}
$language = $request->attributes->get('website')->language();

При тестировании моего приложения код выполняется нормально (веб-сайт находится в RouteServiceProvider), но затем он ломается в контроллере:

testing.ERROR: Abort HTTP request: invalid website

При просмотре атрибута данные пусты в контроллере, но не в RouteServiceProvider:

dump($request->attributes); // in RouteServiceProvider.php
Symfony\Component\HttpFoundation\ParameterBag {
    #parameters: array:1 [
        "website" => ...

dump($request->attributes); // in controller
Symfony\Component\HttpFoundation\ParameterBag {
  #parameters: []
}

Похоже, объект запроса в контроллере уже не тот. При сбросе:

dump(['RouteServiceProvider' => request()]);

Я получил: "RouteServiceProvider" => Подсветка\Http\Request {#385 И в контроллере:

dump(['Controller' => request()]);

"Контроллер" => Подсветка\Http\Request {#9379

Как я могу это исправить?

Взгляните на этот stackoverflow.com/a/47973381/1076753, вы должны использовать !$request->filled('website') вместо 'has'

Vixed 21.03.2019 16:54

Я говорю об атрибутах запроса, а не о параметрах запроса. Тип атрибутов запроса: Symfony\Component\HttpFoundation\ParameterBag.

Spir 21.03.2019 16:57

Не могли бы вы сбросить $request->website... в свой контроллер?

Vixed 21.03.2019 17:03

Как и ожидалось, это ноль. Конечно, это не параметры HTTP, а атрибут HttpFoundation.

Spir 21.03.2019 17:06

Здесь та же проблема, но, похоже, работает с использованием «get» laracasts.com/discuss/channels/laravel/reqeuest-атрибуты В любом случае, не могли бы вы опубликовать метод, который вы использовали в провайдере? Для тех же вещей я использовал «config», который, кажется, наиболее часто используемый способ сделать это.

Vixed 21.03.2019 17:15

Код в вашем RouteServiceProvider, вероятно, должен быть в промежуточном программном обеспечении?

nice_dev 21.03.2019 18:07

Да @vivek_23 Сейчас я пытаюсь использовать промежуточное программное обеспечение. Laravel создает HTTP-запрос в трейте: Illuminate\Foundation\Testing\Concerns\MakesHttpRequests и не копирует мои добавленные атрибуты.

Spir 21.03.2019 18:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
7
289
1

Ответы 1

Прежде всего, я согласен с тем, что этот код должен быть в промежуточном программном обеспечении, а не в RouteServiceProvider.

Если вас интересует только язык, я бы посоветовал просто использовать app()->setLocale() вместо сохранения веб-сайта в своем запросе. Если вам нужна другая информация, содержащаяся в объекте веб-сайта, я бы предложил сохранить ее в сеансе, а не в запросе, потому что я думаю, что этот вид информации больше находится в зоне ответственности сеанса, чем запрос, который больше предназначен для обработки входы, HTTP-глаголы, заголовки, ...

Это может решить вашу проблему, если это не так, давайте посмотрим больше вашего кода и новых результатов dd()

Мне нужно больше информации, сведения о веб-сайте (настройки), язык (ISO, ID...). Поэтому мне действительно нужно сохранить эту информацию в атрибуте запроса и использовать ее в коде. Сначала я попытался использовать промежуточное программное обеспечение, но у этого есть ограничения. Промежуточное ПО выполняется прямо перед контроллером. Но я использую данные в других местах (например, ViewComposer). Поэтому мне нужно будет повторно найти данные... Итак, сейчас я пытаюсь сохранить код как есть и использовать промежуточное программное обеспечение только для теста. Увидим, как пойдет.

Spir 22.03.2019 09:38

Другие вопросы по теме