Доступ по прямому URL с сохранением локали в сеансе в laravel - PullRequest
0 голосов
/ 02 марта 2020

У меня проблема с моими URL.

У меня есть функция публикации новостей на моем веб-сайте. Я использовал Voyager CMS для этого. И мой веб-сайт имеет 3 языка ('ru', 'en', 'uz'). На самом деле я могу добавить новости на трех языках. Некоторые новости добавляются только на одном языке. Два других - это emypty.

И мой прямой URL для реальной статьи выглядит так: https://mywebsite.uz/hcont/562.

Например, языком сайта по умолчанию является английский sh. Я добавил новый пост только на русском языке (engli sh и узбек пуст). Когда кто-то получает доступ к недавно добавленной записи по прямому URL https://mywebsite.uz/hcont/562, как это. Это показывает пустую страницу. Потому что сайт загружает язык по умолчанию (если вы заходите на сайт впервые). Я хочу изменить локаль, нажав прямой URL.

Я знаю, что сначала я должен сделать маршрут https://mywebsite.uz/news/562/en таким. Вопрос в том, как мне настроить этот URL в промежуточном программном обеспечении, контроллере и маршруте?

Ниже моего кода, который сейчас работает для https://mywebsite.uz/hcont/562:

web. php

Route::resource('hcont','HomeController');

Route::get("locale/{locale}" , function($locale){
    Session::put('locale',$locale);

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

HomeController. php

 public function show($id){
        $data = News::findOrFail($id);
        $data->load('translations');
        return view('the-news' , compact('data' ,'locale'));
    }

home.blade. php

              @foreach($news as $item)
                <a href="{{ route('hcont.show', $item->id) }}">
                  <div class="news-item">
                    <div>
                       <img src="{{Voyager::image($item->img)}}" alt="">
                         <div class="news-content">
                          <h5>{!!$item->getTranslatedAttribute('title', \App::getLocale(), 'ru')!!}</h5>
                          <p>{!!str_limit($item->getTranslatedAttribute('body', \App::getLocale(), 'ru') , 70)!!}</p>
                         </div>
                    </div>
                  </div>
                </a>
              @endforeach

Локализация. php

    public function handle($request, Closure $next)
    {

        if(\Session::has('locale')){
            \App::setLocale(\Session::get('locale'));
        }
        return $next($request);
    }

1 Ответ

0 голосов
/ 02 марта 2020

Прежде всего, Voyager не является CMS . Вероятно, вам следует использовать CMS для такого рода вещей.

Один из способов добиться того, чего вы пытаетесь достичь, - это принять locale как часть URL-адреса в качестве необязательного параметра (заканчивающегося * 1006). *) и с необходимой проверкой.

Route::get('/{id}/{locale?}', 'HomeController@show');

Затем внутри HomeController вы можете решить, какую локаль загрузить

public function show($id, $locale = 'en')
{
        $data = News::findOrFail($id);

        return view('the-news' , compact('data' ,'locale'));
}

Таким образом, en действует как локаль по умолчанию (для URL без указания локали), но если локаль задается через URL, вы можете обработать это соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...