在Laravel中,是在会话中传递不同类型的Flash消息的最佳方法


115

我正在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

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

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

任何建议表示赞赏。


itsolutionstuff.com/post/…对我有帮助。
瑞安

Answers:


192

一种解决方案是将两个变量刷新到会话中:

  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该类,则仅需要覆盖它。

(这是一个简单的示例,未经测试:))


3
有趣的是,我不知道默认的参数Session::get() 将会非常方便。
Nick Coad 2014年

1
像大多数Flash消息解决方案一样,它仅处理一条消息。因此,经常有必要能够发出一堆消息(每条消息的严重性可能不同)并将它们全部显示出来。
杰森

2
这就是我们在项目中使用的内容gist.github.com/YavorK/7aa6e839dbe93e8854e4b033e31836a4
Hop Hop

1
这太适得其反了。。。为什么每个人都赞成呢?
Goowik '18年

14
@Goowik-说它适得其反而没有提供更高效的解决方案是适得其反的。
SupaMonkey

49

您认为:

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

然后在控制器中设置一条即显消息:

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

35

我的方法是始终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() }}

4
这简直很棒,但是它是如何工作的$type = $type == 'error' : 'danger';
溢出

1
您在哪里将帮手放在单独的帮手类中?
utdev

16

您可以发出多条消息,并且可以使用不同的类型。请按照以下步骤操作:

  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特征可用于扩展此类的所有控制器。

  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. 关于“ 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时,该变量即可供模板使用。

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

  ...

希望对您有帮助。


13

只需返回要处理的“标志”即可,而无需使用任何其他用户功能。控制器:

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

是的,它确实有效!


您的答案有很多错字,但是您的方法效果很好。
蝙蝠挂绳

6

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

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

5
我不知道我是否会推荐这种方法,因为它将HTML从视图中移出并插入了代码中。
Nick Coad 2014年

5

不太喜欢提供的解决方案(即:多个变量,帮助程序类,“可能存在的变量”循环)。下面是一个使用数组而不是两个单独变量的解决方案。如果需要,它还可以轻松扩展以处理多个错误,但是为了简单起见,我将其保留为一条即显消息:

使用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只是从http://bootstrap-notify.remabledesigns.com/初始化bootstrap-notify :

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"}});
}

4

对于我的应用程序,我做了一个辅助函数:

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

3

我通常这样做

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

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

在我的destroy()函数中,我想将警报涂成红色,以便通知其已删除

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

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

在我看来,我将添加条件以在适当的时候调用特定警报

@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消息样式。


3

您可以使用Laravel宏。

您可以macros.phpapp/helpers route.php中并包含它。

如果您希望将宏放在类文件中,则可以查看本教程:http : //chrishayes.ca/blog/code/laravel-4-object-directional-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

3

我认为以下代码在较少的代码行中会很好地工作。

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

我正在使用烤面包机包装,但是您可以在视图中找到类似的东西。

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

2

在控制器中:

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

要么

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

在“根据您期望的模式在“刀片”中的“刀片”中显示消息:

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

您如何传递className?
老板COTIGA

1

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

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


0

如果您想使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.