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, например:

change middleware to middlewareGroups

Итак, в вашем приложении\Kernel.php, вам нужно сначала поставить StartSession на массив middleware group web:

put the StartSession at first on array of middleware group web