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

 牛尾巴2010 发布于 2023-02-05 09:41

我正在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语句.

任何建议表示赞赏

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

      消息本身

      警报的"级别"

    例如:

    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类以外的东西.

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

    2023-02-05 09:44 回答
  • 您可以制作多条消息并使用不同类型.请按照以下步骤操作:

      创建一个文件:" 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.');
      }
    
      ...
    

    希望它能帮到你.

    2023-02-05 09:45 回答
  • 在你看来:

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

    2023-02-05 09:45 回答
  • 只需返回您想要处理的"标志",而无需使用任何其他用户功能.控制者:

    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
    

    是的,它确实有效!

    2023-02-05 09:46 回答
  • 我的方法是始终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() }}
    

    2023-02-05 09:46 回答
  • 另一个解决方案是创建一个帮助器类 如何在这里创建帮助器类

    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
    

    2023-02-05 09:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有