Laravel 5.2 即使使用 Web 中间件,Session Flash 也无法正常工作
Laravel 5.2 Session flash not working even with web middleware
我正在尝试使用会话实现 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"}
很多人遇到这个问题是因为web中间件里面没有相关的路由。我也确保这样做了,但还是不行。
在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',
],
];
任何人都可以让我知道我在这里做错了什么吗?谢谢!
使用此代码构建您的 Session 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
没有别的。网络中间件被分配到每个路由。
通过替换
解决了问题
Route::group(['middleware' => ['web']], function () {
...
});
与
Route::group(['middlewareGroups' => ['web']], function () {
...
});
虽然所有文档都建议我们使用 ['middleware' => ['web']]
,但不知道为什么会这样
这很可能是因为对 Laravel 框架 (v5.2.27) 进行了更改,默认情况下所有路由都是 "web" 中间件的一部分,因此再次分配它在您的 routes.php 文件中最终分配了两次。
解决方案是从您的路由中删除 "web" 中间件,或者从 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(在 routes.php 中手动分配 "web" 中间件),只需在此处将其删除。
我不知道为什么,但是在 Windows 你需要改变你的路线:中间件到中间件组,就像这样:
因此,在您的 app\Kernel.php 中,您需要首先将 StartSession 放在中间件组 web 数组中:
我正在尝试使用会话实现 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"}
很多人遇到这个问题是因为web中间件里面没有相关的路由。我也确保这样做了,但还是不行。
在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',
],
];
任何人都可以让我知道我在这里做错了什么吗?谢谢!
使用此代码构建您的 Session 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
没有别的。网络中间件被分配到每个路由。
通过替换
解决了问题Route::group(['middleware' => ['web']], function () {
...
});
与
Route::group(['middlewareGroups' => ['web']], function () {
...
});
虽然所有文档都建议我们使用 ['middleware' => ['web']]
这很可能是因为对 Laravel 框架 (v5.2.27) 进行了更改,默认情况下所有路由都是 "web" 中间件的一部分,因此再次分配它在您的 routes.php 文件中最终分配了两次。
解决方案是从您的路由中删除 "web" 中间件,或者从 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(在 routes.php 中手动分配 "web" 中间件),只需在此处将其删除。
我不知道为什么,但是在 Windows 你需要改变你的路线:中间件到中间件组,就像这样:
因此,在您的 app\Kernel.php 中,您需要首先将 StartSession 放在中间件组 web 数组中: