在Laravel中,在会话中传递不同types的Flash消息的最佳方式

我正在Laravel制作我的第一个应用程序,并试图让我的头部围绕会话的Flash消息。 据我所知,在我的控制器行动,我可以通过去设置一个Flash消息

Redirect::to('users/login')->with('message', 'Thanks for registering!'); //is this actually OK? 

对于redirect到另一个路由的情况,或者

 Session::flash('message', 'This is a message!'); 

在我的主刀片模板中,我会有:

 @if(Session::has('message')) <p class="alert alert-info">{{ Session::get('message') }}</p> @endif 

正如你可能已经注意到我在我的应用程序中使用Bootstrap 3,并希望使用不同的消息类: alert-infoalert-warningalert-danger等。

假设在我的控制器中,我知道我正在设置什么types的消息,在视图中传递和显示它的最好方法是什么? 我应该在会话中为每种types设置一个单独的消息(例如Session::flash('message_danger', 'This is a nasty message! Something's wrong.'); )? 然后,我需要为我的刀片模板中的每条消息分别添加if语句。

任何意见赞赏。

一个解决scheme是将两个variables闪烁到会话中:

  1. 消息本身
  2. 警报的“类”

例如:

 Session::flash('message', 'This is a message!'); Session::flash('alert-class', 'alert-danger'); 

那么在你看来:

 @if(Session::has('message')) <p class="alert {{ Session::get('alert-class', 'alert-info') }}">{{ Session::get('message') }}</p> @endif 

注意我已经把默认值放入Session::get() 。 这样,如果警告应该不是alert-info类,那么只需要覆盖它。

(这是一个简单的例子,未经testing:))

在你看来:

 <div class="flash-message"> @foreach (['danger', 'warning', 'success', 'info'] as $msg) @if(Session::has('alert-' . $msg)) <p class="alert alert-{{ $msg }}">{{ Session::get('alert-' . $msg) }}</p> @endif @endforeach </div> 

然后在控制器中设置一个flash消息:

 Session::flash('alert-danger', 'danger'); Session::flash('alert-warning', 'warning'); Session::flash('alert-success', 'success'); Session::flash('alert-info', 'info'); 

我的方法是总是redirect::回()或redirect::到():

 Redirect::back()->with('message', 'error|There was an error...'); Redirect::back()->with('message', 'message|Record updated.'); Redirect::to('/')->with('message', 'success|Record updated.'); 

我有一个帮助函数来使它适用于我,通常这是在一个单独的服务:

 function displayAlert() { if (Session::has('message')) { list($type, $message) = explode('|', Session::get('message')); $type = $type == 'error' : 'danger'; $type = $type == 'message' : 'info'; return sprintf('<div class="alert alert-%s">%s</div>', $type, message); } return ''; } 

在我看来或布局,我只是做

 {{ displayAlert() }} 

如果你使用Laravel 5,请查看laracasts的这个包:

https://github.com/laracasts/flash

只需返回您想要处理的“标志”,而无需使用任何其他用户function。 控制器:

 return \Redirect::back()->withSuccess( 'Message you want show in View' ); 

请注意,我使用了“成功”标志。

风景:

 @if( Session::has( 'success' )) {{ Session::get( 'success' ) }} @elseif( Session::has( 'warning' )) {{ Session::get( 'warning' ) }} <!-- here to 'withWarning()' --> @endif 

是的,它真的有用!

您可以创build多个消息并使用不同的types。 请按照下列步骤操作:

  1. 创build一个文件:“ 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特性可用于扩展此类的所有控制器。

  1. 为我们的消息创build一个刀片模板:“ 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); }); } ... } 

这将使$messagesvariables在“ 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. 在您的控制器上,您可以简单地执行此操作来推送Flash消息:
 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.'); } ... 

希望它能帮助你。

另一个解决scheme是创build一个助手类如何在这里创build助手类

 class Helper{ public static function format_message($message,$type) { return '<p class="alert alert-'.$type.'">'.$message.'</p>' } } 

那么你可以做到这一点。

 Redirect::to('users/login')->with('message', Helper::format_message('A bla blah occured','error')); 

要么

 Redirect::to('users/login')->with('message', Helper::format_message('Thanks for registering!','info')); 

并在你看来

 @if(Session::has('message')) {{Session::get('message')}} @endif 

对于我的应用程序,我做了一个帮手function:

 function message( $message , $status = 'success', $redirectPath = null ) { $redirectPath = $redirectPath == null ? back() : redirect( $redirectPath ); return $redirectPath->with([ 'message' => $message, 'status' => $status, ]); } 

消息布局,“main.layouts.message”:

 @if($status) <div class="center-block affix alert alert-{{$status}}"> <i class="fa fa-{{ $status == 'success' ? 'check' : $status}}"></i> <span> {{ $message }} </span> </div> @endif 

并导入每个显示消息的地方:

 @include('main.layouts.message', [ 'status' => session('status'), 'message' => session('message'), ]) 

你可以使用Laravelmacros。

你可以在app/helpers创buildmacros.php并包含它的routes.php。

如果您希望将macros放在类文件中,请参阅本教程: http : //chrishayes.ca/blog/code/laravel-4-object-oriented-form-html-macros-classes-service-提供商

 HTML::macro('alert', function($class='alert-danger', $value="",$show=false) { $display = $show ? 'display:block' : 'display:none'; return '<div class="alert '.$class.'" style="'.$display.'"> <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> <strong><i class="fa fa-times"></i></strong>'.$value.' </div>'; }); 

在你的控制器中:

 Session::flash('message', 'This is so dangerous!'); Session::flash('alert', 'alert-danger'); 

在你的视图

 @if(Session::has('message') && Session::has('alert') ) {{HTML::alert($class=Session::get('alert'), $value=Session::get('message'), $show=true)}} @endif 

我通常这样做

在我的商店()function,我把成功警报一旦保存正确。

 \Session::flash('flash_message','Office successfully updated.'); 

在我的destroy()函数中,我想将红色的警报着色,以通知它被删除

 \Session::flash('flash_message_delete','Office successfully deleted.'); 

注意,我们用不同的闪存名称创build两个警报。

在我看来,我会增加条件的时候,具体的警报将被调用

 @if(Session::has('flash_message')) <div class="alert alert-success"><span class="glyphicon glyphicon-ok"></span><em> {!! session('flash_message') !!}</em></div> @endif @if(Session::has('flash_message_delete')) <div class="alert alert-danger"><span class="glyphicon glyphicon-ok"></span><em> {!! session('flash_message_delete') !!}</em></div> @endif 

在这里你可以在Laravel 5中find不同的flash消息stlyes Flash Messages