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

har*_*ryg 101 session laravel laravel-4

我正在Laravel制作我的第一个应用程序,并试图让我的头围绕会话flash消息.据我所知,在我的控制器操作中,我可以设置一条flash消息

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

对于重定向到另一条路线的情况,或

Session::flash('message', 'This is a message!'); 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

任何建议表示赞赏

mst*_*rdy 160

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

  1. 消息本身
  2. 警报的"级别"

例如:

Session::flash('message', 'This is a message!'); 
Session::flash('alert-class', 'alert-danger'); 
Run Code Online (Sandbox Code Playgroud)

然后在你看来:

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

注意我已将默认值放入Session::get().这样你只需要覆盖它,如果警告应该是alert-info类以外的东西.

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

  • @Goowik - 在没有提供更高效的解决方案的同时说它的反效果是适得其反的. (7认同)
  • 有趣的是,我不知道`Session :: get()`的默认参数.这将是非常方便的. (3认同)
  • 像大多数闪存消息解决方案一样,这只处理一条消息。通常,有必要能够发出一堆消息,每个消息可能具有不同的严重性,并将它们全部显示出来。 (2认同)
  • 以下是我们在项目中使用的内容https://gist.github.com/YavorK/7aa6e839dbe93e8854e4b033e31836a4 (2认同)
  • 这太适得其反了……为什么每个人都赞成这个? (2认同)

dan*_*ips 40

在你看来:

<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>
Run Code Online (Sandbox Code Playgroud)

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

Session::flash('alert-danger', 'danger');
Session::flash('alert-warning', 'warning');
Session::flash('alert-success', 'success');
Session::flash('alert-info', 'info');
Run Code Online (Sandbox Code Playgroud)


Ant*_*iro 33

我的方法是始终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.');
Run Code Online (Sandbox Code Playgroud)

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

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 '';
}
Run Code Online (Sandbox Code Playgroud)

在我的观点或布局中,我只是这样做

{{ displayAlert() }}
Run Code Online (Sandbox Code Playgroud)

  • 这简直太棒了但是这怎么工作`$ type = $ type =='error':'dangerous';` (4认同)

cle*_*nes 13

您可以制作多条消息并使用不同类型.请按照以下步骤操作:

  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);
  }
}
Run Code Online (Sandbox Code Playgroud)
  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;
}
Run Code Online (Sandbox Code Playgroud)

这将使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
Run Code Online (Sandbox Code Playgroud)
  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);
      });
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

这将使$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>
Run Code Online (Sandbox Code Playgroud)

您只需要在您要在页面上显示消息的位置包含消息模板.

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

  ...
Run Code Online (Sandbox Code Playgroud)

希望它能帮到你.


Ric*_*alo 12

只需返回您想要处理的"标志",而无需使用任何其他用户功能.控制者:

return \Redirect::back()->withSuccess( 'Message you want show in View' );
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了"Success"标志.

风景:

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

是的,它确实有效!


Ayo*_*emi 6

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

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

然后你就可以做到这一点.

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

要么

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

并在你看来

@if(Session::has('message'))
    {{Session::get('message')}}
@endif
Run Code Online (Sandbox Code Playgroud)

  • 我不知道我是否会推荐这种方法,因为它将HTML从视图中移除到代码中. (4认同)

Sup*_*key 5

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

使用 flash 消息数组重定向:

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

基于数组内容的输出:

@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
Run Code Online (Sandbox Code Playgroud)

不相关,因为您可能有自己的通知方法/插件 - 但只是为了清楚起见 - 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"}});
}
Run Code Online (Sandbox Code Playgroud)


sha*_*een 5

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

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
Run Code Online (Sandbox Code Playgroud)