Laravel 5 中的闪存数据

Flash data in Laravel 5

我正在尝试显示闪存数据,但显示不正确。它正在显示:

{{ Session::get('flash_message') }}

但应该是消息

"Your article has been created"

我的代码有什么问题?谢谢!

在我的控制器中我有:

public function store(ArticleRequest $request) 
{ 
    Auth::user()->articles()->create($request->all());

    \Session::flash('flash_message', 'Your article has been created');

    return redirect('articles');            
}

我的app.blade.php是:

<!DOCTYPE html>
    <head>
    <meta charset="UTF-8">
        <title>App Name - @yield('title')</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
        <link rel="stylesheet" href="{{ elixir('css/all.css') }}">
        <script src= "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
        <script src="js/app.js"></script>
    </head>
    <body>

        <div class="container">

            @if(Session::has('flash_message'))
                <div class="alert alert-success">{{ Session::get('flash_message') }}</div>
            @endif

            @yield('content')

        </div>

        @yield('footer')

    </body>
</html>

在我的 route.php 中,我有以下内容:花括号将内容显示为字符串而不是变量。

<?php
Blade::setContentTags('<%', '%>'); // for variables and all things Blade
Blade::setEscapedContentTags('<%%', '%%>'); // for escaped data

Route::get('/', function() {
 return 'Home Page';
});

Route::get('blade', function () {
    return view('about');
});

   
Route::get('about', 'HelloWorld@about');

Route::get('foo', ['middleware' => 'manager', function() {
 return 'this page may only be viewed by managers';
}]);
   

Route:resource('articles', 'ArticlesController');

Route::controllers([
 'auth' => 'Auth\AuthController',
 'password' => 'Auth\PasswordController'

]);

如果你的 route.php 中有这个:

Blade::setContentTags('<%', '%>');

那么这意味着您不能对 blade 内容使用大括号。试试这个:

@if(Session::has('flash_message'))
    <div class="alert alert-success">
        <% Session::get('flash_message') %>
    </div>
@endif

或者直接从您的 route.php 中删除 setContentTags() 调用。

您可以制作多条不同类型的消息。 按照以下步骤操作:

  1. 创建文件:“app/Components/FlashMessages.php
namespace App\Components;

trait FlashMessages
{
  protected static function message($level = 'info', $message = null)
  {
      if (session()->has('messages')) {
          $messages = session()->pull('messages');
      }

      $messages[] = $message = ['level' => $level, 'message' => $message];

      session()->flash('messages', $messages);

      return $message;
  }

  protected static function messages()
  {
      return self::hasMessages() ? session()->pull('messages') : [];
  }

  protected static function hasMessages()
  {
      return session()->has('messages');
  }

  protected static function success($message)
  {
      return self::message('success', $message);
  }

  protected static function info($message)
  {
      return self::message('info', $message);
  }

  protected static function warning($message)
  {
      return self::message('warning', $message);
  }

  protected static function danger($message)
  {
      return self::message('danger', $message);
  }
}
  1. 在你的基础控制器上“app/Http/Controllers/Controller.php”。
namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesResources;

use App\Components\FlashMessages;

class Controller extends BaseController
{
    use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;

    use FlashMessages;
}

这将使 FlashMessages 特性可用于扩展此 class 的所有控制器。

  1. 为我们的消息创建一个 blade 模板:“views/partials/messages.blade.php
@if (count($messages))
<div class="row">
  <div class="col-md-12">
  @foreach ($messages as $message)
      <div class="alert alert-{{ $message['level'] }}">{!! $message['message'] !!}</div>
  @endforeach
  </div>
</div>
@endif
  1. 关于“app/Providers/AppServiceProvider.php”的“boot()”方法:
namespace App\Providers;

use Illuminate\Support\ServiceProvider; 

use App\Components\FlashMessages;

class AppServiceProvider extends ServiceProvider
{
  use FlashMessages;

    public function boot()
    {
        view()->composer('partials.messages', function ($view) {

          $messages = self::messages();

          return $view->with('messages', $messages);
      });
    }

    ...
}

这将使 $messages 变量在调用“views/partials/message.blade.php”模板时可用。

  1. 在您的模板中,包含我们的消息模板 -“views/partials/messages.blade.php
<div class="row">
  <p>Page title goes here</p>
</div>

@include ('partials.messages')

<div class="row">
  <div class="col-md-12">
      Page content goes here
  </div>
</div>

您只需在要在页面上显示消息的任何位置包含消息模板。

  1. 在您的控制器上,您可以简单地执行此操作来推送快闪消息:
use App\Components\FlashMessages;

class ProductsController {

  use FlashMessages;

  public function store(Request $request)
  {
      self::message('info', 'Just a plain message.');
      self::message('success', 'Item has been added.');
      self::message('warning', 'Service is currently under maintenance.');
      self::message('danger', 'An unknown error occured.');

      //or

      self::info('Just a plain message.');
      self::success('Item has been added.');
      self::warning('Service is currently under maintenance.');
      self::danger('An unknown error occured.');
  }

  ...

希望对您有所帮助。