我正在Laravel制作我的第一个应用程序,并试图让我的头围绕会话flash消息.据我所知,在我的控制器操作中,我可以设置一条flash消息
Redirect::to('users/login')->with('message', 'Thanks for registering!'); //is this actually OK?
对于重定向到另一条路线的情况,或
Session::flash('message', 'This is a message!');
在我的主刀片模板中,我有:
@if(Session::has('message')){{ Session::get('message') }}
@endif
:正如你可能我在我的应用程序中使用自举3,并想使不同的消息类别的使用已经注意到alert-info
,alert-warning
,alert-danger
等.
假设在我的控制器中我知道我正在设置什么类型的消息,在视图中传递和显示它的最佳方式是什么?我应该在会话中为每种类型设置单独的消息(例如Session::flash('message_danger', 'This is a nasty message! Something's wrong.');
)吗?然后我需要为我的刀片模板中的每条消息添加一个单独的if语句.
任何建议表示赞赏
一种解决方案是将两个变量闪存到会话中:
消息本身
警报的"级别"
例如:
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
类以外的东西.
(这是一个快速的例子,未经测试:))
您可以制作多条消息并使用不同类型.请按照以下步骤操作:
创建一个文件:" 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
所有扩展此类的控制器都可以使用该特征.
为我们的消息创建刀片模板:" 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
关于" boot()
"的方法app/Providers/AppServiceProvider.php
:
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>
您只需要在您要在页面上显示消息的位置包含消息模板.
在您的控制器上,您只需执行此操作即可推送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.'); } ...
希望它能帮到你.
在你看来:
<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');
只需返回您想要处理的"标志",而无需使用任何其他用户功能.控制者:
return \Redirect::back()->withSuccess( 'Message you want show in View' );
请注意,我使用了"Success"标志.
风景:
@if( Session::has( 'success' )) {{ Session::get( 'success' ) }} @elseif( Session::has( 'warning' )) {{ Session::get( 'warning' ) }} <!-- here to 'withWarning()' --> @endif
是的,它确实有效!
我的方法是始终Redirect :: back()或Redirect :: to():
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() }}
另一个解决方案是创建一个帮助器类 如何在这里创建帮助器类
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