Laravel'de, oturumda farklı türlerdeki flash mesajları iletmenin en iyi yolu


115

Laravel'de ilk uygulamamı yapıyorum ve oturumun flaş mesajlarına kafa yormaya çalışıyorum. Denetleyici eylemimin farkında olduğum kadarıyla, şu yolla bir flaş mesaj ayarlayabilirim:

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

Başka bir rotaya yönlendirme durumunda veya

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

Usta bıçak şablonumda şu özelliklere sahip olurdum:

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

: Eğer benim app Bootstrap 3 kullanıyorum ve farklı mesaj sınıflarının faydalanmak istiyoruz fark etmiş olabileceğiniz gibi alert-info, alert-warning, alert-dangervb

Denetleyicimde ne tür bir mesaj ayarladığımı bildiğimi varsayarsak, bunu iletmenin ve görünümde görüntülemenin en iyi yolu nedir? Her tür için oturumda ayrı bir mesaj ayarlamalı mıyım (örneğin Session::flash('message_danger', 'This is a nasty message! Something's wrong.');)? O zaman, blade şablonumdaki her mesaj için ayrı bir if ifadesine ihtiyacım olacak.

Herhangi bir tavsiye takdir edilir.


Yanıtlar:


193

Çözümlerden biri, iki değişkeni oturuma aktarmak olabilir:

  1. Mesajın kendisi
  2. Uyarınızın "sınıfı"

Örneğin:

Session::flash('message', 'This is a message!'); 
Session::flash('alert-class', 'alert-danger'); 

Sonra size göre:

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

Bir koyduk Not varsayılan değeri içine Session::get(). bu şekilde, yalnızca uyarı alert-infosınıftan farklı bir şey olması gerekiyorsa onu geçersiz kılmanız gerekir .

(bu hızlı bir örnek ve denenmemiş :))


3
İlginç, bunun Session::get() çok kullanışlı olacağı varsayılan parametresini bilmiyordum .
Nick Coad

1
Çoğu flaş mesaj çözümü gibi, bu yalnızca bir mesajla ilgilenir. Çoğu zaman, her biri farklı bir önem derecesi olan bir grup mesajı ateşleyebilmek ve hepsinin görüntülenmesi gerekir.
Jason


1
Bu çok üretken değil ... Neden herkes buna olumlu oy veriyor?
Goowik

14
@Goowik - Daha üretken bir çözüm sunmazken tersine verimli olduğunu söylemek ters üretkenliktir.
SupaMonkey

49

Size göre:

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

Ardından denetleyicide bir flaş mesaj ayarlayın:

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

35

Benim yolum her zaman Redirect :: back () veya 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.');

Benim için çalışmasını sağlayacak bir yardımcı işlevim var, genellikle bu ayrı bir hizmette:

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

Ve benim görüşüme veya düzenime göre sadece yapıyorum

{{ displayAlert() }}

4
Bu sadece harika ama bu iş nasıl$type = $type == 'error' : 'danger';
taşması

1
Yardımcınızı ayrı bir Yardımcı Sınıfta nereye yerleştirirsiniz?
utdev

16

Farklı türlerde birden çok mesaj oluşturabilirsiniz. Aşağıdaki adımları izleyin:

  1. Bir dosya oluşturun: " 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. Ana kontrol cihazınızda " 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;
}

Bu, FlashMessagesözelliği bu sınıfı genişleten tüm denetleyiciler için kullanılabilir hale getirecektir .

  1. Mesajlarımız için bir bıçak şablonu oluşturun: " 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()" Yönteminde " 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);
      });
    }

    ...
}

Bu, $messagesdeğişkeni views/partials/message.blade.phpher çağrıldığında şablon için kullanılabilir hale getirecektir .

  1. Şablonunuza mesaj şablonumuzu ekleyin - " 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>

Sayfanızdaki mesajları görüntülemek istediğiniz her yerde mesaj şablonunu eklemeniz yeterlidir.

  1. Kontrol cihazınızda, flash mesajları itmek için bunu kolayca yapabilirsiniz:
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.');
  }

  ...

Umarım sana yardım ederim.


13

Herhangi bir ek kullanıcı işlevi kullanmadan işlem görmesini istediğiniz 'bayrak' ile geri dönmeniz yeterlidir. Kontrol eden, denetleyici:

return \Redirect::back()->withSuccess( 'Message you want show in View' );

"Başarılı" bayrağını kullandığıma dikkat edin.

Görünüm:

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

Evet, gerçekten işe yarıyor!


Cevabınızda bir sürü yazım hatası var, ancak yaklaşımınız harika çalışıyor.
Yarasa İpi

6

Başka bir çözüm de yardımcı sınıf oluşturmaktır Burada yardımcı sınıflar nasıl oluşturulur

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

O zaman bunu yapabilirsiniz.

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

veya

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

ve senin görüşüne göre

@if(Session::has('message'))
    {{Session::get('message')}}
@endif

5
HTML'yi görünümden çıkarıp koda taşıdığı için bu yaklaşımı tavsiye eder miyim bilmiyorum.
Nick Coad

5

Sağlanan çözümlerin büyük bir hayranı değil (yani: birden çok değişken, yardımcı sınıflar, 'muhtemelen var olan değişkenler' arasında döngü). Aşağıda, iki ayrı değişken yerine bir dizi kullanan bir çözüm bulunmaktadır. Dilerseniz birden fazla hatayı işlemek için kolayca genişletilebilir, ancak basit olması için, bunu bir flaş mesajda tuttum:

Flash mesaj dizisi ile yönlendirin :

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

Dizi içeriğine dayalı çıktı:

@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

Kendi bildirim yönteminize / eklentinize sahip olabileceğinizden ilgisiz - ancak sadece netlik için - bootstrapNotify yalnızca http://bootstrap-notify.remabledesigns.com/ adresinden bootstrap-notify'ı başlatmak içindir :

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

Uygulamam için bir yardımcı fonksiyon yaptım:

function message( $message , $status = 'success', $redirectPath = null )
{
     $redirectPath = $redirectPath == null ? back() : redirect( $redirectPath );

     return $redirectPath->with([
         'message'   =>  $message,
         'status'    =>  $status,
    ]);
}

mesajı düzen, 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

ve mesajın gösterileceği her yere aktarın:

@include('main.layouts.message', [
    'status'    =>  session('status'),
    'message'   =>  session('message'),
])

3

Bunu genellikle yaparım

store () işlevimde, düzgün bir şekilde kaydedildikten sonra başarı uyarısı koydum.

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

destroy () işlevimde, silindiğini bildirmek için uyarıyı kırmızıya boyamak istedim

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

Dikkat edin, farklı flash adlarıyla iki uyarı oluşturuyoruz.

Ve benim görüşüme göre, belirli bir uyarının doğru zamanda çağrılacağına koşul ekleyeceğim.

@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

Burada Laravel 5'te farklı flash mesaj stilleri Flash Mesajları bulabilirsiniz.


3

Laravel Makrolarını kullanabilirsiniz.

Route.php macros.php içinde oluşturabilir app/helpersve ekleyebilirsiniz .

makrolarınızı bunun yerine bir sınıf dosyasına koymak isterseniz, şu eğiticiye bakabilirsiniz: http://chrishayes.ca/blog/code/laravel-4-object-oriented-form-html-macros-classes-service- Sağlayıcı

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

Denetleyicinizde:

Session::flash('message', 'This is so dangerous!'); 
Session::flash('alert', 'alert-danger');

Sizin Görüşünüzde

@if(Session::has('message') && Session::has('alert') )
  {{HTML::alert($class=Session::get('alert'), $value=Session::get('message'), $show=true)}}
@endif

3

Aşağıdakilerin daha az kod satırı ile iyi çalışacağını düşünüyorum.

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

Ekmek kızartma makinesi paketi kullanıyorum, ancak size göre böyle bir şey olabilir.

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

2

Denetleyicide:

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

Veya

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

Blade'de Blade'de İstenilen Desen Olarak Mesaj göster:

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

ClassName'i nasıl geçersiniz?
Boss COTIGA

1

Sadece oturumda bir dizi yerine şöyle bir dizi gönderin:

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

Görünümünüzü daha etkileşimli hale getirmek için Bootstrap Uyarısını kullanmak istiyorsanız. Bunun gibi bir şey yapabilirsiniz:

Görevinizde: -

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

Görüşlerinizde: -

@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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.