Flash-сессия Laravel 5.2 не работает даже с веб-промежуточным ПО

Я пытаюсь реализовать флэш-сообщения с использованием сеансов, но не могу этого сделать.

В моем контроллере у меня есть:

public function store(Request $request) {
session()->flash('donald', 'duck');
session()->put('mickey', 'mouse');
return redirect()->action('CustomerController@index')->with('bugs', 'bunny');
}

Но когда я проверяю переменные сеанса в представлении, я вижу только значения из session()->put('mickey', 'mouse'),

сессия:

{"_token":"F6DoffOFb17B36eEJQruxvPe0ra1CbyJiaooDn3F","_previous":{"url":"http:\/\/localhost\/customers\/create"},"flash":{"old":[],"new":[]},"mickey":"mouse"}

Многие люди столкнулись с этой проблемой, не имея соответствующих маршрутов внутри веб-промежуточного программного обеспечения. Я также сделал это, но это все равно не сработало.

В маршрутах .php:

Route::group(['middleware' => ['web']], function () {

Route::get('/', function () {
return view('welcome');
});

Route::get('/customers', 'CustomerController@index');
Route::get('/customers/create', 'CustomerController@create');
Route::post('/customers', 'CustomerController@store');
});

В Kernel.php:

protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],

'api' => [
'throttle:60,1',
],
];

Кто-нибудь может дать мне знать, что я могу здесь делать неправильно? Спасибо!

6

Решение

Исправлена ​​проблема с заменой

Route::group(['middleware' => ['web']], function () {
...
});

с

Route::group(['middlewareGroups' => ['web']], function () {
...
});

Не знаю, почему это работает, хотя, когда вся документация предполагает, что мы используем ['middleware' => ['web']]

29

Другие решения

Это более чем вероятно из-за изменений, внесенных в инфраструктуру Laravel (v5.2.27), что все маршруты по умолчанию являются частью «веб» промежуточного программного обеспечения, поэтому повторное назначение его в файле rout.php приводит к его двойному назначению ,

Решением является либо удаление «веб-» промежуточного программного обеспечения из ваших маршрутов, либо удаление автоматического назначения из RouteServiceProvider.

Перед обновлением Laravel:

// RouteServiceProvider.php
$router->group(['namespace' => $this->namespace], function ($router) {
require app_path('Http/routes.php');
});

После обновления Laravel:

// RouteServiceProvider.php
$router->group([
'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
require app_path('Http/routes.php');
});

Обратите внимание, как новое обновление автоматически применяет промежуточное программное обеспечение «web» ко всем маршрутам. Просто удалите его здесь, если вы хотите продолжить использовать Laravel 5.2, как раньше (вручную назначая «веб» промежуточное программное обеспечение в вашем rout.php).

5

Создайте информацию о вашей сессии, используя этот код:

<?php

Session::flash("Donald", "Duck")
// Or in your code style.
$request->session()->flash("Donald", "Duck")
?>

Проверьте это по вашему мнению с:

@if(Session::has("Donald")
{{Session::get("Donald")}}
@endif

Вы забыли использовать $ request 🙂

2

В контроллере:

use Session,Redirect;

public function store(Request $request)
{
Session::flash('donald', 'duck');
Session::put('mickey', 'mouse');
return Redirect::to('/customers')->with('bugs', 'bunny');
}

В «представлении» проверьте, получают данные или нет:

<?php
print_r($bugs);die;
?>

Удачи 🙂

1

Я использую следующее:

В моем контроллере:

public function xyz(){
// code

// This
return redirect()->action('homeController@index')->with('success', 'Check! Everything done!');

// Or this
return redirect('/index')->with('success', 'Check! Everything done!');
}

По-моему:

@if(session('success'))
{{ session('success') }}
@endif

Ничего больше. Промежуточное веб-программное обеспечение назначается каждому маршруту.

1

Я не знаю почему, но в Windows вам нужны изменения в ваших маршрутах: промежуточное программное обеспечение для промежуточного программного обеспечения, например:

изменить промежуточное программное обеспечение на промежуточное программное обеспечениеГруппы

Итак, в вашем app \ Kernel.php вам нужно сначала поместить StartSession в массив группы промежуточного программного обеспечения:

поместите StartSession сначала в массив веб-группы промежуточного программного обеспечения

1
По вопросам рекламы [email protected]