Задать вопрос
@Wiemdier_brenul

Как установить необязательный префикс?

У меня есть 2 файла роутов web.php и web2.php, для web2.php я установил в RouteServiceProvider префикс:
Route::middleware(['web','default_locale'])
                ->prefix('/{language?}')
                ->group(base_path('routes/web/web2.php'));

Где language устанавливается в зависимости от выбранного языка: es, en, ru. Устанавливаю я его вот так:
public function handle(Request $request, Closure $next)
    {
        if ($request->route()->parameter('language') != app()->getLocale()) {
            $newLocale = $request->route()->parameter('language');
            if (in_array($newLocale, config('app.available_locales'))) {
                $this->setNewLanguage($newLocale,$request,$next);
            } else {
                $this->setNewLanguage('en',$request,$next);
            }
        } else {
            URL::defaults(['locale' => \app()->getLocale()]);
        }
        return $next($request);
    }

    public function setNewLanguage($language,Request $request, Closure $next){
        app()->setLocale($language);
        session()->put('locale', $language);
        URL::defaults(['language' => \app()->getLocale()]);
        return $next($request);
    }
. Так как главный язык - английский, мне не нужно в юрл показывать, что язык - en. Для этого, во время переключения языка, я исключаю его:
if($locale != \App\Http\Middleware\Localization::English){
        URL::defaults(['language' => $locale]);
    }else{
        URL::defaults(['language' => '']);
    }

Сейчас он не видит этих роутов без префикса, но если продублировать все роуты из web2.php в web1.php, все будет работать как нужно, но получается я просто продублировал маршруты, что довольно глупо. Как можно указать в RouteServiceProvider, что эта группа роутов, может и не быть с префиксом?
  • Вопрос задан
  • 180 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@iljaGolubev
Через роуты - никак.
В routing#parameters-optional-parameters не указано, но необязательные параметры должны быть в конце роута иначе не будет найден.
Роут вида x/{p1?}/{p2?} - не делает p1 необязательным даже если обработчик function($p1=1, $p2=2)`

Route::middleware(['web','default_locale'])->prefix('/{language?}')
middleware не выполнится пока не будет указан language.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
neuotq
@neuotq
Прокрастинация
Способ есть, через динамическое возвращение в префиксе, ну грубо говоря:

Route::middleware('default_locale')
->prefix(request()->segment(1) == 'ru' ? request()->segment(1) : null )
->group(function () {
    Route::get('/', function (){
      return view('playground', [
        'language' => app()->getLocale()
      ]);
    });
});

Можно ту штуку в префиксе вынести в отдельную функцию, я написал кратко чтобы была понятна сама идея доп штуки с проверкой на все локали я думаю вы сами допишете.
Ну и изменить сам Миддлвар оставив там только логику установки локали не устанавливая переменную locale.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы