Параметр Laravel в каждом URL

Я прочитал почти все в Интернете и в документации, но не могу найти решение своей проблемы.

У меня есть переменная, хранящаяся в Session, я хочу поместить эту переменную в каждый URL-адрес, созданный route('some-route').

В Session у меня sub = "mysubid"

Когда я генерирую Route route('my-route'), я хочу передать этот параметр sub в строке запроса: http://domain.dom/my-route-parameter?sub=mysubid

Вы можете помочь мне решить эту проблему? Мы будем благодарны за любой полезный ответ;

Я знаю, что не могу передать такой параметр, как: route('my-route', ['sub' => \Session::get('sub') ]), но у меня слишком много маршрута в моих представлениях для его рефакторинга, и я хочу сделать его автоматическим

Malkhazi Dartsmelidze 09.01.2019 11:46

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

Cid 09.01.2019 11:47

Для ясности: вы хотите, чтобы у всех маршрутов был один и тот же параметр всегда?

JustCarty 09.01.2019 11:48

@JustCarty Верно. У меня есть параметр в сеансе, и я хочу передать его в каждом маршруте.

Malkhazi Dartsmelidze 09.01.2019 11:51

Пользователь @Cid должен видеть этот параметр в URL-адресе.

Malkhazi Dartsmelidze 09.01.2019 11:53

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

Petay87 09.01.2019 11:54

@MalkhaziDartsmelidze чаще всего это может быть сделано в фоновом режиме, вы уверены, что это нужно передать через URL-адрес?

Script47 09.01.2019 11:54
«Пользователь должен видеть этот параметр в URL» Это еще одна отличная идея от нетехнического менеджера или для этого есть причина? Пользователи Lambda не заботятся о переменных в URL
Cid 09.01.2019 11:56

Да, для этого есть причина, а также отличная идея от менеджера: D

Malkhazi Dartsmelidze 09.01.2019 12:04

Почему бы не создать вспомогательную функцию, которая обернет метод route() и не выполнит ее. Это означает, что вы замените вызов route() своей функцией, например, customRoute()?

Oluwatobi Samuel Omisakin 09.01.2019 12:17

@MalkhaziDartsmelidze Просто обратите внимание, я немного обновил ваши теги, чтобы показать Laravel 5.7.

Oluwatobi Samuel Omisakin 09.01.2019 15:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
11
1 758
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать функцию значений по умолчанию.

Сначала создайте новое промежуточное ПО php artisan make:middleware SetSubIdFromSession. Затем сделайте следующее:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetSubIdFromSession
{
    public function handle($request, Closure $next)
    {
        URL::defaults(['sub' => \Session::get('sub')]);

        return $next($request);
    } 
}

В конце зарегистрируйте новое промежуточное ПО в app/Http/Kernel.php, добавив его в $routeMiddleware.

protected $routeMiddleware = [
   // other Middlewares
   'sessionDefaultValue' => App\Http\Middleware\SetSubIdFromSession::class,
];

Добавьте {sub} и промежуточное ПО в определение вашего маршрута:

Route::get('/{sub}/path', function () {  
   //
})
->name('my-route')
->middleware('sessionDefaultValue');

Поскольку вы хотите, чтобы это происходило на каждом веб-маршруте, вы также можете добавить промежуточное ПО в группу промежуточного программного обеспечения web:

protected $middlewareGroups = [
    'web' => [
        // other Middlewares
        'sessionDefaultValue',
    ],

    'api' => [
        //
    ] 
];

Отличная идея, но я не могу передать параметр со строкой запроса с этим кодом

Malkhazi Dartsmelidze 09.01.2019 12:03

Я не получаю сообщения об ошибке, но он не добавляет запрос к URL-адресу

Malkhazi Dartsmelidze 09.01.2019 12:53

Какую версию Laravel вы используете?

common sense 09.01.2019 12:54

Я использую версию 5.7

Malkhazi Dartsmelidze 09.01.2019 12:54

Попробуйте это, вам нужно создать промежуточное ПО php artisan make: промежуточное ПО SetSubSession

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetSubsSession
{
public function handle($request, Closure $next)
{
    if (session('sub')){
        $url = url()->full();
        return redirect($url.'?sub='.session('sub'));
    }
    return $next($request);
} 
} 

в app / http / Kernel.php

 protected $routeMiddleware = [
 ........
 'setsubsession' => \App\Http\Middleware\SetSubsSession::class,
 ]

в route.php добавить

 Route::group(['middleware' => 'setsubsession'], function(){ 
      //and define all the route you want to add sub parameter
 });

используя это, вам не нужно изменять все ваши маршруты. Это автоматически добавит "sub" в маршрут, определенный в этом промежуточном программном обеспечении.

Пожалуйста, примите во внимание влияние этого подхода на производительность. Во-первых, это, скорее всего, приведет к бесконечному циклу, он не проверяет, установлен ли sub в запросе, поэтому попытается выполнить перенаправление снова. Затем, если вы решите эту проблему, каждая ссылка по-прежнему будет иметь 2 запроса: первоначальный запрос без sub, а затем перенаправленный запрос.

Adrian Gonzales 27.04.2021 18:14

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