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()
调用。
您可以制作多条不同类型的消息。
按照以下步骤操作:
- 创建文件:“
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);
}
}
- 在你的基础控制器上“
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 的所有控制器。
- 为我们的消息创建一个 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
- 关于“
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
”模板时可用。
- 在您的模板中,包含我们的消息模板 -“
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>
您只需在要在页面上显示消息的任何位置包含消息模板。
- 在您的控制器上,您可以简单地执行此操作来推送快闪消息:
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.');
}
...
希望对您有所帮助。
我正在尝试显示闪存数据,但显示不正确。它正在显示:
{{ 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()
调用。
您可以制作多条不同类型的消息。 按照以下步骤操作:
- 创建文件:“
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); } }
- 在你的基础控制器上“
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 的所有控制器。
- 为我们的消息创建一个 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
- 关于“
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
”模板时可用。
- 在您的模板中,包含我们的消息模板 -“
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>
您只需在要在页面上显示消息的任何位置包含消息模板。
- 在您的控制器上,您可以简单地执行此操作来推送快闪消息:
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.'); } ...
希望对您有所帮助。