Laravel 5.2 Session flash не работает даже с веб-промежуточным по
Я пытаюсь реализовать flash-сообщения с помощью сеансов, но не могу этого сделать.
в моем контроллере у меня есть:
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"}
многие люди столкнулись с этой проблемой, не имея соответствующих маршрутов внутри веб-промежуточного программного обеспечения. Я сделал это, но это все равно не сработает.
In маршруты.на 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');
});
В Ядре.на PHP:
protected $middlewareGroups = [
'web' => [
AppHttpMiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
AppHttpMiddlewareVerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
может ли кто-нибудь дать мне знать, что я могу делать неправильно здесь? Спасибо!
6 ответов
Исправлена ошибка путем замены
Route::group(['middleware' => ['web']], function () {
...
});
С
Route::group(['middlewareGroups' => ['web']], function () {
...
});
не знаю, почему это работает, хотя, когда вся документация предполагает, что мы используем ['middleware' => ['web']]
это более чем вероятно из-за изменения, которое было сделано в рамках Laravel (v5.2.27) что все маршруты по умолчанию являются частью промежуточного программного обеспечения "web", поэтому назначайте его снова в своих маршрутах.php-файл в конечном итоге назначает его дважды.
решение: удалить "паутину" промежуточного слоя из вашего маршрута или удалить автоматическое присвоение от RouteServiceProvider.
перед обновлением Laravel:
// RouteServiceProvider.php
$router->group(['namespace' => $this->namespace], function ($router) {
require app_path('Http/routes.php');
});
после Laravel update:
// RouteServiceProvider.php
$router->group([
'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
require app_path('Http/routes.php');
});
обратите внимание, как новое обновление автоматически применяет промежуточное программное обеспечение " web " ко всем маршрутам. Просто удалите его здесь, Если вы хотите продолжить использовать Laravel 5.2, Как и раньше (вручную назначая" веб " промежуточное ПО в ваших маршрутах.РНР.)
создайте информацию о сеансе flash, используя этот код:
<?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');
}
в "view" проверьте, получают ли данные или нет:
<?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
ничего другого. Web-middleware назначается каждому маршруту.
Я не знаю, почему, но в Windows вам нужны изменения в ваших маршрутах: middleware в middlewareGroups, например:
Итак, в вашем приложении\Kernel.php, вам нужно сначала поставить StartSession на массив middleware group web: