ใน Laravel วิธีที่ดีที่สุดในการส่งข้อความแฟลชประเภทต่างๆในเซสชัน


115

ฉันกำลังสร้างแอปแรกใน 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

ในขณะที่คุณอาจจะสังเกตเห็นฉันใช้เงินทุนที่ 3 ใน app ของฉันและต้องการที่จะทำให้การใช้งานของการเรียนข้อความที่แตกต่างกัน: alert-info, alert-warning, alert-dangerฯลฯ

สมมติว่าในคอนโทรลเลอร์ของฉันฉันรู้ว่าฉันกำลังตั้งค่าข้อความประเภทใดวิธีใดที่ดีที่สุดในการส่งผ่านและแสดงในมุมมอง ฉันควรตั้งค่าข้อความแยกต่างหากในเซสชันสำหรับแต่ละประเภท (เช่นSession::flash('message_danger', 'This is a nasty message! Something's wrong.');) หรือไม่? จากนั้นฉันต้องการคำสั่ง if แยกต่างหากสำหรับแต่ละข้อความในเทมเพลตใบมีดของฉัน

คำแนะนำใด ๆ ที่ชื่นชม


itsolutionstuff.com/post/…เป็นประโยชน์สำหรับฉัน
Ryan

คำตอบ:


193

ทางออกหนึ่งคือการแฟลชสองตัวแปรในเซสชัน:

  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() That จะมีประโยชน์มาก
Nick Coad

1
เช่นเดียวกับโซลูชันข้อความแฟลชส่วนใหญ่จะเกี่ยวข้องกับข้อความเดียวเท่านั้น บ่อยครั้งที่มีความจำเป็นที่จะต้องสามารถส่งข้อความจำนวนมากออกไปได้โดยแต่ละข้อความอาจมีความรุนแรงต่างกันและแสดงข้อความทั้งหมด
Jason

2
นี่คือสิ่งที่เราใช้ในโครงการของเราgist.github.com/YavorK/7aa6e839dbe93e8854e4b033e31836a4
Hop hop

1
นี่เป็นการตอบโต้ ... ทำไมทุกคนถึงโหวตเรื่องนี้?
Goowik

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

  ...

หวังว่าจะช่วยคุณได้


14

เพียงส่งกลับด้วย 'แฟล็ก' ที่คุณต้องการได้รับการปฏิบัติโดยไม่ต้องใช้ฟังก์ชันผู้ใช้เพิ่มเติมใด ๆ ตัวควบคุม:

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

ใช่มันใช้งานได้จริง!


คุณมีคำตอบที่พิมพ์ผิดมากมาย แต่แนวทางของคุณใช้ได้ผลดี
Bat Lanyard

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

5

ไม่ใช่แฟนตัวยงของโซลูชันที่มีให้ (เช่น: ตัวแปรหลายตัว, คลาสตัวช่วย, วนลูปผ่าน 'ตัวแปรที่อาจมีอยู่') ด้านล่างนี้เป็นโซลูชันที่ใช้อาร์เรย์แทนซึ่งตรงข้ามกับตัวแปรสองตัวที่แยกจากกัน นอกจากนี้ยังสามารถขยายได้อย่างง่ายดายเพื่อจัดการกับข้อผิดพลาดหลายประการหากคุณต้องการ แต่เพื่อความเรียบง่ายฉันได้เก็บไว้เป็นข้อความแฟลชเดียว:

เปลี่ยนเส้นทางด้วยอาร์เรย์ข้อความแฟลช:

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

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

คุณจะพบข้อความแฟลชที่แตกต่างกันในรูปแบบFlash Messages ใน Laravel 5


3

คุณสามารถใช้ Laravel Macros

คุณสามารถสร้างmacros.php ในapp/helpersและรวมไว้ routes.php

หากคุณต้องการใส่มาโครของคุณในไฟล์คลาสแทนคุณสามารถดูบทช่วยสอนนี้: http://chrishayes.ca/blog/code/laravel-4-object-oriented-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')}}'
             );

3

ในตัวควบคุม:

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

หรือ

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

ในข้อความ Blade show ใน Blade As ur Desired Pattern:

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

คุณผ่าน className ได้อย่างไร?
Boss 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.