Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 02.03.2017 13:18:44

Проблема с Session::get();

Пытаюсь реализовать мултиязычность на сайте.

Локаль которую нужно показать получаю так

Route::get('setlocale/{locale}', 'HomeController@language');

    public function language($locale){

          if (in_array($locale, \Config::get('app.locales'))) {   // Проверяем, если у пользователя выбран доступный язык
          	Session::put('locale', $locale);                    // Устанавливаем его в сессии под именем locale
          }

          return Redirect::back();
    }

Если в blade вставить

{{\Session::get('locale')}}

, то получаю нужное значение (скажем ru)

А если в __construct вставить такой код

if (Session::get('locale') != null) {
          $lang = Session::get('locale');
        } else if (Session::get('locale') == null) {
          $lang = "null";
        }
        View::share('lang', $lang);

, то получаю null. Ломаю голову, не могу понять почему !?

Естественно в контроллере подключены

use View;
use Session;

Помогите пожалуйста понять почему __construct не выдает значение Session::get('locale'). Спасибо заранее

Не в сети

#2 02.03.2017 18:04:21

Re: Проблема с Session::get();

я точно не знаю но чисто наугад могу предположить что конструктор отрабатывает до того как будет создан объект сессии и в \Session появятся какие-либо данные

проверить можно очень просто, если настроен отладчик. ставим одну точку останова в конструктор, а вторую – в /vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php в метод handle(). если первая сработает раньше второй, значит я угадал smile

Не в сети

#3 02.03.2017 18:40:53

skiphog
Откуда: Киров, Россия
Сообщений: 26

Re: Проблема с Session::get();

constb пишет:

я точно не знаю но чисто наугад могу предположить что конструктор отрабатывает до того как будет создан объект сессии и в \Session появятся какие-либо данные

Можно не проверять. Всё так и есть.
Начиная с версии 5.3, в конструкторе контроллера нельзя получить доступ к сессии и Auth::user() тоже, т.к. middlware еще не запустился.
Подобный вопрос на laracast https://laracasts.com/discuss/channels/ … onstructor
Об этом упоминается в документации здесь https://laravel.com/docs/5.3/upgrade#5. … nstructors
Еще больше про это написано здесь ну и костыль там же https://laravel-news.com/controller-con … aravel-5-3

Не в сети

#4 02.03.2017 22:25:40

Re: Проблема с Session::get();

Всем спасибо, решил так

public function __construct()
{
   $this->middleware(function ($request, $next) 
   {
        $this->lang = session()->has( 'locale' ) ? session()->get( 'locale' ) : [];
        App::setLocale($this->lang);
       return $next($request);
    });
}

Не в сети

Подвал раздела