Я прочитал почти все в Интернете и в документации, но не могу найти решение своей проблемы.
У меня есть переменная, хранящаяся в Session, я хочу поместить эту переменную в каждый URL-адрес, созданный route('some-route').
В Session у меня sub = "mysubid"
Когда я генерирую Route route('my-route'), я хочу передать этот параметр sub в строке запроса: http://domain.dom/my-route-parameter?sub=mysubid
Вы можете помочь мне решить эту проблему? Мы будем благодарны за любой полезный ответ;
Почему ты бы так поступил? У вас уже есть эти данные, хранящиеся в сеансе.
Для ясности: вы хотите, чтобы у всех маршрутов был один и тот же параметр всегда?
@JustCarty Верно. У меня есть параметр в сеансе, и я хочу передать его в каждом маршруте.
Пользователь @Cid должен видеть этот параметр в URL-адресе.
Я думаю, что было бы разумнее вложить все ваши маршруты в одну группу промежуточного программного обеспечения и обрабатывать там все, что вы когда-либо делаете с этим сеансом. ИЛИ используйте данные сеанса в контроллере, поскольку добавление к маршруту не приносит пользы, поскольку они уже где-то хранятся, вы просто открываете их пользователю.
@MalkhaziDartsmelidze чаще всего это может быть сделано в фоновом режиме, вы уверены, что это нужно передать через URL-адрес?
Да, для этого есть причина, а также отличная идея от менеджера: D
Почему бы не создать вспомогательную функцию, которая обернет метод route() и не выполнит ее. Это означает, что вы замените вызов route() своей функцией, например, customRoute()?
@MalkhaziDartsmelidze Просто обратите внимание, я немного обновил ваши теги, чтобы показать Laravel 5.7.






Вы можете использовать функцию значений по умолчанию.
Сначала создайте новое промежуточное ПО 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' => [
//
]
];
Отличная идея, но я не могу передать параметр со строкой запроса с этим кодом
Я не получаю сообщения об ошибке, но он не добавляет запрос к URL-адресу
Какую версию Laravel вы используете?
Я использую версию 5.7
Попробуйте это, вам нужно создать промежуточное ПО 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, а затем перенаправленный запрос.
Я знаю, что не могу передать такой параметр, как:
route('my-route', ['sub' => \Session::get('sub') ]), но у меня слишком много маршрута в моих представлениях для его рефакторинга, и я хочу сделать его автоматическим