Я пытаюсь внедрить флэш-сообщения с использованием сеансов, но не могу этого сделать.
В моем контроллере у меня есть:
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"}
Многие люди столкнулись с этой проблемой, не имея соответствующих маршрутов внутри промежуточного программного обеспечения. Я тоже сделал это, но он все равно не сработает.
В routes.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', ], ];
Может ли кто-нибудь сообщить мне, что я могу делать неправильно здесь? Благодаря!
Исправлена проблема путем замены
Route::group(['middleware' => ['web']], function () { ... });
с
Route::group(['middlewareGroups' => ['web']], function () { ... });
Не знаю, почему это работает, хотя, когда вся документация предполагает, что мы используем ['middleware' => ['web']]
Это более чем вероятно из-за изменений, внесенных в структуру Laravel (v5.2.27), что все маршруты по умолчанию являются частью промежуточного программного обеспечения «сети», поэтому назначение его снова в файле routes.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'); });
Обратите внимание, как новое обновление автоматически применяет «сетевое» промежуточное ПО ко всем маршрутам. Просто удалите его здесь, если вы хотите продолжить использование Laravel 5.2, как и раньше, (вручную назначая «промежуточное ПО» в ваших маршрутах.php).
Создайте флеш-информацию Session, используя этот код:
<?php Session::flash("Donald", "Duck") // Or in your code style. $request->session()->flash("Donald", "Duck") ?>
Проверьте это в своем представлении с помощью:
@if(Session::has("Donald") {{Session::get("Donald")}} @endif
Вы забыли использовать $ request 🙂
В контроллере:
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; ?>
Удачи 🙂
Я использую следующее:
В моем контроллере:
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
Ничего больше. Веб-промежуточное ПО назначается каждому маршруту.
Я не знаю, почему, но в Windows вам нужны изменения в ваших маршрутах: промежуточное ПО и middlewareGroups, например:
Итак, в вашем приложении \ Kernel.php вам нужно сначала поставить StartSession на массив промежуточной группы: