在 Laravel,在会话中传递不同类型的 flash 消息的最佳方式

我正在 Laravel 开发我的第一个应用程序,并且正在努力理解那些会话的 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'))
<p class="alert alert-info">{{ Session::get('message') }}</p>
@endif

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

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

谢谢你的建议。

375283 次浏览

一种解决办法是在会议中闪现两个变量:

  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类的情况下才需要重写它。

(这是一个快速的例子,未经测试:)

另一种解决方案是创建一个 helper 类 如何在这里创建帮助类

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

我的方法是总是重定向: : back ()或重定向: : to () :

Redirect::back()->with('message', 'error|There was an error...');


Redirect::back()->with('message', 'message|Record updated.');


Redirect::to('/')->with('message', 'success|Record updated.');

我有一个助手功能,让它为我工作,通常这是在一个单独的服务:

use Illuminate\Support\Facades\Session;


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() }}

在你看来:

<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');

你可以用 Laravel Macros。

您可以在 app/helpers中创建 macros.php,并将其包含在 outoutes.php 中。

如果你想把你的宏放在一个类文件中,你可以看看这个教程: http://chrishayes.ca/blog/code/laravel-4-object-oriented-form-html-macros-classes-service-provider

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

只需返回“标志”,您希望在不使用任何其他用户函数的情况下进行处理。 总监:

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

是的,它真的工作!

在我的应用程序中,我创建了一个 helper 函数:

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'),
])

我经常这样

在我的 store ()函数中,一旦正确保存,我就设置成功警报。

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

在我的 delete ()函数中,我想将警报颜色设置为红色,以便通知它已被删除

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

注意,我们创建了两个具有不同 flash 名称的警报。

在我看来,我将添加条件时,具体的时间警报将被调用

@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中的 Flash 消息

您可以使用不同的类型创建多个消息。 遵循以下步骤:

  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 trait。

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


...
}

这将使“ views/partials/message.blade.php”模板每次调用 $messages变量时都可以使用它。

  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.');
}


...

希望能帮到你。

不太喜欢所提供的解决方案(例如: 多变量、辅助类、循环遍历“可能存在的变量”)。下面是一个使用数组而不是两个独立变量的解决方案。如果您希望处理多个错误,它也很容易扩展,但为了简单起见,我将其保留为一条 flash 消息:

使用 flash 消息 数组重定向:

    return redirect('/admin/permissions')->with('flash_message', ['success','Updated Successfully','Permission "'. $permission->name .'" updated successfully!']);

基于数组内容的输出:

@if(Session::has('flash_message'))
<script type="text/javascript">
jQuery(document).ready(function(){
bootstrapNotify('\{\{session('flash_message')[0]}}','\{\{session('flash_message')[1]}}','\{\{session('flash_message')[2]}}');
});
</script>
@endif

不相关,因为你可能有你自己的通知方法/插件-但只是为了清楚-bootstrapNotify 只是启动 bootstrap 通知从 http://bootstrap-notify.remabledesigns.com/:

function bootstrapNotify(type,title = 'Notification',message) {
switch (type) {
case 'success':
icon = "la-check-circle";
break;
case 'danger':
icon = "la-times-circle";
break;
case 'warning':
icon = "la-exclamation-circle";
}


$.notify({message: message, title : title, icon : "icon la "+ icon}, {type: type,allow_dismiss: true,newest_on_top: false,mouse_over: true,showProgressbar: false,spacing: 10,timer: 4000,placement: {from: "top",align: "right"},offset: {x: 30,y: 30},delay: 1000,z_index: 10000,animate: {enter: "animated bounce",exit: "animated fadeOut"}});
}

我认为以下代码可以很好地处理较少的代码行。

        session()->flash('toast', [
'status' => 'success',
'body' => 'Body',
'topic' => 'Success']
);

我使用的是烤面包机包装,但你可以在视野中看到这样的东西。

             toastr.\{\{session('toast.status')}}(
'\{\{session('toast.body')}}',
'\{\{session('toast.topic')}}'
);

总监:

Redirect::to('/path')->with('message', 'your message');

或者

Session::flash('message', 'your message');

在 Blade 显示消息在 Blade 作为你想要的模式:

@if(Session::has('message'))
<div class="alert alert-className">
\{\{session('message')}}
</div>
@endif

只需在会话中发送数组而不是字符串,如下所示:

Session::flash('message', ['text'=>'this is a danger message','type'=>'danger']);


@if(Session::has('message'))
<div class="alert alert-\{\{session('message')['type']}}">
\{\{session('message')['text']}}
</div>
@endif

我无意中发现了这种优雅的快讯方式,它是由来自 Laracast 的杰弗里•韦(Jeffrey Way)制作的。 看看这个。 Https://github.com/laracasts/flash

如果你想使用 Bootstrap Alert 使你的视图更具交互性,你可以这样做:

在你的功能:-

if($author->save()){
Session::flash('message', 'Author has been successfully added');
Session::flash('class', 'success'); //you can replace success by [info,warning,danger]
return redirect('main/successlogin');

在你看来:-

@if(Session::has('message'))
<div class="alert alert-\{\{Session::get('class')}} alert-dismissible fade show w-50 ml-auto alert-custom"
role="alert">
\{\{ Session::get('message') }}
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
@endif

我喜欢被投票最多的答案。 在我的例子中,我决定使用 session()函数包装器,以避免在刀片模板中调用 facade。控制器也一样。在我看来,这样代码更干净。

排队

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

变成了

session()->flash('message', 'This is a message!');

还有刀片模板

session()->get('alert-class', 'alert-info');

干杯!

我们可以使用 Session ()全局助手而不是 Session

// flash message create
session()->flash('message', 'This is a message!');
session()->flash('alert-class', 'alert-danger');


// get flash message by key from your blade file
@if(session()->has('message'))
<p class="alert \{\{ session('alert-class') }}">\{\{ session('message') }}</p>
@endif

您可以像下面这样使用全局帮助器会话

session()->get('message')

还有

session()->flash('message')