Я пытаюсь реализовать флэш-сообщения с использованием сеансов, но не могу этого сделать.
В моем контроллере у меня есть:
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',
],
];
Кто-нибудь может дать мне знать, что я могу здесь делать неправильно? Спасибо!
Исправлена проблема с заменой
Route::group(['middleware' => ['web']], function () {
...
});
с
Route::group(['middlewareGroups' => ['web']], function () {
...
});
Не знаю, почему это работает, хотя, когда вся документация предполагает, что мы используем ['middleware' => ['web']]
Это более чем вероятно из-за изменений, внесенных в инфраструктуру 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).
Создайте информацию о вашей сессии, используя этот код:
<?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 вам нужны изменения в ваших маршрутах: промежуточное программное обеспечение для промежуточного программного обеспечения, например:
Итак, в вашем app \ Kernel.php вам нужно сначала поместить StartSession в массив группы промежуточного программного обеспечения: