ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在 Laravel 中制作我的第一个应用程序,并试图让我的头脑了解会话闪存消息。据我所知,在我的控制器操作中,我可以通过

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 语句。

任何建议表示赞赏。

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

m
msturdy

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

消息本身 警报的“类别”

例如:

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

请注意,我已将 default value 放入 Session::get()。这样,如果警告应该是 alert-info 类以外的东西,您只需要覆盖它。

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


有趣的是,我不知道 Session::get() 的默认参数,它会派上用场。
与大多数 Flash 消息解决方案一样,这仅处理一条消息。通常,有必要能够触发一堆消息,每个消息可能具有不同的严重性,并将它们全部显示出来。
这太适得其反了......为什么每个人都赞成这个?
@Goowik - 说它适得其反而不提供更高效的解决方案是适得其反的。
d
danelips

在您看来:

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

S
Shukri Yusof

我的方法是始终 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.');

我有一个辅助函数可以让它为我工作,通常这是在一个单独的服务中:

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

这简直太棒了,但它是如何工作的$type = $type == 'error' : 'danger';
你在哪里把你的助手放在一个单独的助手类中?
它应该是 {!! displayAlert() !!}
c
clemquinones

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

创建一个文件:“app/Components/FlashMessages.php”

命名空间应用\组件;特征 FlashMessages { 受保护的静态函数消息($level = 'info',$message = null){ if (session()->has('messages')) { $messages = session()->pull('messages') ; } $messages[] = $message = ['level' => $level, 'message' => $message]; session()->flash('messages', $messages);返回$消息; } 受保护的静态函数消息() { 返回 self::hasMessages() ? session()->pull('messages') : []; } 受保护的静态函数 hasMessages() { return session()->has('messages'); } 受保护的静态函数成功($message){ return self::message('success', $message); } 受保护的静态函数 info($message) { return self::message('info', $message); } 受保护的静态函数警告($message){ return self::message('warning', $message); } 受保护的静态函数危险($message) { return self::message('danger', $message); } }

在您的基本控制器“app/Http/Controllers/Controller.php”上。

命名空间 App\Http\Controllers;使用 Illuminate\Foundation\Bus\DispatchesJobs;使用 Illuminate\Routing\Controller 作为 BaseController;使用 Illuminate\Foundation\Validation\ValidatesRequests;使用 Illuminate\Foundation\Auth\Access\AuthorizesRequests;使用 Illuminate\Foundation\Auth\Access\AuthorizesResources;使用 App\Components\FlashMessages;类控制器扩展 BaseController { 使用 AuthorizesRequests、AuthorizesResources、DispatchesJobs、ValidatesRequests;使用 FlashMessages; }

这将使 FlashMessages 特征可用于扩展此类的所有控制器。

为我们的消息创建一个刀片模板:“views/partials/messages.blade.php”

@if (count($messages))

@foreach ($messages as $message)
{!! $message['message'] !!}
@endforeach
@endif

关于“app/Providers/AppServiceProvider.php”的“boot()”方法:

命名空间应用\提供者;使用 Illuminate\Support\ServiceProvider;使用 App\Components\FlashMessages;类 AppServiceProvider 扩展 ServiceProvider { 使用 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”

页面标题在这里

@include ('partials.messages')
页面内容放在这里

您只需要将消息模板包含在您想要在页面上显示消息的任何位置。

在您的控制器上,您可以简单地执行此操作来推送闪存消息:

使用 App\Components\FlashMessages;类 ProductsController { 使用 FlashMessages; public function store(Request $request) { self::message('info', '只是一条普通的消息。'); self::message('成功', '项目已添加。'); self::message('warning', '服务正在维护中。'); self::message('danger', '发生未知错误。'); //或 self::info('只是一条普通的消息。'); self::success('项目已添加。'); self::warning('服务正在维护中。'); self::danger('发生未知错误。'); } ...

希望对你有帮助。


好的。实际上需要在 Laravel 中找到多条消息的解决方案。
w
williamvicary

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

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

是的,它确实有效!


您的答案中有大量错别字,但您的方法效果很好。
C
Community

另一种解决方案是创建一个帮助类 How to Create helper classes here

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

我不知道我是否会推荐这种方法,因为它将 HTML 从视图中取出并放入代码中。
S
SupaMonkey

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

使用 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/ 启动引导通知:

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

s
shamaseen

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

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

ح
حضور و غیاب با نرم افزار

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

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

U
Uladz Kha

在控制器中:

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

或者

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

在 Blade As ur Desired Pattern 中的 Blade show 消息中:

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

你如何通过 className ?
I
Ikong

我通常这样做

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

在这里您可以找到不同的 Flash 消息样式Flash Messages in Laravel 5


E
Emeka Mbah

你可以使用 Laravel 宏。

您可以在 app/helpers 中创建 macros.php 并将其包含在 routes.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

S
Segun Kess

我认为以下内容适用于较少的代码行。

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

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

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

J
Johan H.

我遇到了这种发送消息的优雅方式。它是由 Laracast 的 Jeffrey Way 制作的。看看... https://github.com/laracasts/flash


A
Arun Raj KV

我们可以使用 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

R
Riwaj Chalise

如果您想使用 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

u
user16780927

我喜欢最受好评的答案。就我而言,我决定使用 session() 函数包装器以避免在刀片模板中调用 facade。在控制器中也是如此。在我看来,它使代码更干净。

线

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

变成

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

并在刀片模板中

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

干杯!


A
Akhyar Maulana

您可以使用全局助手会话,例如

session()->get('message') 

session()->flash('message')

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅