Перевести страницы - отсутствуют обязательные параметры для маршрута - PullRequest
0 голосов
/ 08 июня 2018

У меня есть меню выбора в нижней части сайта.Каждый вариант - это название страны.Сайт по умолчанию английский, но пользователь должен иметь возможность выбрать одну из 5 доступных стран, и сайт должен перевести текст на этот выбранный язык.

С кодом ниже появляется «Missing required parameters for [Route: site.translate] [URI: {language}].».Знаете ли вы, где находится ошибка?

// LocaleMiddleware

class LocaleMiddleware
{
    protected $languages = ['en','fr','es', 'de'];
    public function handle($request, Closure $next)
    {
        if(!session()->has('locale'))
        {
            session()->put('locale', $request->getPreferredLanguage($this->languages));
        }
        app()->setLocale(session('locale'));
        return $next($request);
    }
}

// Контроллер TranslateLocale

class TranslateLocale extends Controller
{
    public function language($language)
    {
        if(Session::has(locale)){
            session()->set('locale', $language);}
        else{
            session()->set('locale', 'en');
        }

        return redirect()->back();
    }
}

Маршрут:

Route::get('/{language}', [
    'uses' => 'TranslateLocale@language',
    'as'   =>'site.translate'
]);

HTML-меню выбора в нижнем колонтитуле для пользователя, чтобы выбрать язык:

<h3>Language</h3>
<form method="get" action="{{route('site.translate')}}">
    {{csrf_field()}}
    <select name="language" class="form-control" id="exampleFormControlSelect1">
        <option selected class="selected" value="de">German</option>
        <option value="en">English</option>
        <option value="fr">French</option>
        <option value="es">Spanish</option>
        <option>5</option>
    </select>
</form>

1 Ответ

0 голосов
/ 08 июня 2018

Форма добавляет ваш параметр как значение GET , поэтому laravel не распознает его как язык переменных, если вы хотите сохранить маршрут таким, какой он есть, вы должны сгенерировать URL, но яподумайте, что более простым решением было бы настроить ваш маршрут и контроллер на что-то вроде этого:

Подход 1:

Маршрут

Route::get('/language', [
    'uses' => 'TranslateLocale@language',
    'as'   =>'site.translate'
]);

Контроллер

class TranslateLocale extends Controller
{
    public function language(Request $request)
    {
        if (Session::has(locale)) :
           session()->set('locale', $request->language);//obtain value from GET parameter
        else :
            session()->set('locale', 'en');
        endif;

        return redirect()->back();
    }
}

Если вам действительно нужно сохранить существующий маршрут , одним из способов его решения будет создание маршрута с использованием JavaScript в зависимости от выбранного значения, этоможет быть сделано с помощью чего-то вроде:

// прикрепить и идентификатор к вашей форме -> id="languageForm" Затем с помощью js:

$('#languageForm').submit(function(e) {
   // change action route from the default GET /?language to /{language}
   $('#languageForm').attr('action', '/' + $('#exampleFormControlSelect1').val());
   // not sure if you need to specify .submit() on the form again, try with or without hehe xd
   $('#languageForm').submit();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...