В моем приложении я добавляю атрибуты к 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
Как я могу это исправить?
Я говорю об атрибутах запроса, а не о параметрах запроса. Тип атрибутов запроса: Symfony\Component\HttpFoundation\ParameterBag.
Не могли бы вы сбросить $request->website... в свой контроллер?
Как и ожидалось, это ноль. Конечно, это не параметры HTTP, а атрибут HttpFoundation.
Здесь та же проблема, но, похоже, работает с использованием «get» laracasts.com/discuss/channels/laravel/reqeuest-атрибуты В любом случае, не могли бы вы опубликовать метод, который вы использовали в провайдере? Для тех же вещей я использовал «config», который, кажется, наиболее часто используемый способ сделать это.
Код в вашем RouteServiceProvider, вероятно, должен быть в промежуточном программном обеспечении?
Да @vivek_23 Сейчас я пытаюсь использовать промежуточное программное обеспечение. Laravel создает HTTP-запрос в трейте: Illuminate\Foundation\Testing\Concerns\MakesHttpRequests и не копирует мои добавленные атрибуты.






Прежде всего, я согласен с тем, что этот код должен быть в промежуточном программном обеспечении, а не в RouteServiceProvider.
Если вас интересует только язык, я бы посоветовал просто использовать app()->setLocale() вместо сохранения веб-сайта в своем запросе. Если вам нужна другая информация, содержащаяся в объекте веб-сайта, я бы предложил сохранить ее в сеансе, а не в запросе, потому что я думаю, что этот вид информации больше находится в зоне ответственности сеанса, чем запрос, который больше предназначен для обработки входы, HTTP-глаголы, заголовки, ...
Это может решить вашу проблему, если это не так, давайте посмотрим больше вашего кода и новых результатов dd()
Мне нужно больше информации, сведения о веб-сайте (настройки), язык (ISO, ID...). Поэтому мне действительно нужно сохранить эту информацию в атрибуте запроса и использовать ее в коде. Сначала я попытался использовать промежуточное программное обеспечение, но у этого есть ограничения. Промежуточное ПО выполняется прямо перед контроллером. Но я использую данные в других местах (например, ViewComposer). Поэтому мне нужно будет повторно найти данные... Итак, сейчас я пытаюсь сохранить код как есть и использовать промежуточное программное обеспечение только для теста. Увидим, как пойдет.
Взгляните на этот stackoverflow.com/a/47973381/1076753, вы должны использовать !$request->filled('website') вместо 'has'