在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-info
, alert-warning
, alert-danger
等。
假设在我的控制器中,我知道我正在设置什么types的消息,在视图中传递和显示它的最好方法是什么? 我应该在会话中为每种types设置一个单独的消息(例如Session::flash('message_danger', 'This is a nasty message! Something's wrong.');
)? 然后,我需要为我的刀片模板中的每条消息分别添加if语句。
任何意见赞赏。
一个解决scheme是将两个variables闪烁到会话中:
- 消息本身
- 警报的“类”
例如:
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的这个包:
只需返回您想要处理的“标志”,而无需使用任何其他用户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。 请按照下列步骤操作:
- 创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); } }
- 在你的基础控制器“
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
特性可用于扩展此类的所有控制器。
- 为我们的消息创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
- 在“
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
variables在“ 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>
您只需将消息模板包含在要在页面上显示消息的位置。
- 在您的控制器上,您可以简单地执行此操作来推送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">×</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