Dans Laravel, la meilleure façon de passer différents types de messages flash dans la session

je fais ma première application à Laravel et j'essaie de me concentrer sur les messages flash de la session. Dans la mesure où je suis au courant dans mon action de contrôleur je peux définir un message flash soit en allant

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

dans le cas d'une réorientation vers une autre route, ou

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

dans mon modèle de lame, j'aurais alors:

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

comme vous avez peut-être remarqué, J'utilise Bootstrap 3 dans mon application et je voudrais faire utilisation des différentes classes de messages: alert-info , alert-warning , alert-danger etc.

en supposant que dans mon contrôleur je sais quel type de message je mets, Quelle est la meilleure façon de passer et de l'afficher dans la vue? Dois-je mettre un message séparé dans la session pour chaque type (par exemple Session::flash('message_danger', 'This is a nasty message! Something's wrong.'); )? J'aurais besoin d'une déclaration si séparée pour chaque message dans mon modèle de lame.

tout conseil apprécié.

68
demandé sur harryg 2014-01-08 23:02:39

11 réponses

une solution serait de flash deux variables dans la session:

  1. le message lui-même
  2. La "classe" de votre alerte

par exemple:

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

Alors à votre avis:

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

Note j'ai mis une valeur par défaut dans le Session::get() . de cette façon, vous avez seulement besoin de passer si l'avertissement doit être quelque chose d'autre que la classe alert-info .

(qui est un exemple rapide, et non testé:)

116
répondu msturdy 2014-01-08 19:15:21

de votre point De vue:

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

puis définir un message flash dans le contrôleur:

Session::flash('alert-danger', 'danger');
Session::flash('alert-warning', 'warning');
Session::flash('alert-success', 'success');
Session::flash('alert-info', 'info');
32
répondu danelips 2014-09-04 03:57:49

à Ma façon est de toujours Rediriger::back() ou 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.');

j'ai une fonction d'aide pour le faire fonctionner pour moi, c'est généralement un service distinct:

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

Et de mon point de vue ou la mise en page je viens de faire

{{ displayAlert() }}
26
répondu Antonio Carlos Ribeiro 2014-04-11 10:56:17

revenez simplement avec le 'drapeau' que vous voulez être traité sans utiliser de fonction d'utilisateur supplémentaire. Le Contrôleur:

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

remarquez que j'ai utilisé le drapeau "Success".

Le Point De Vue:

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

oui, ça marche vraiment!

9
répondu Richelly Italo 2015-08-07 21:35:55

si vous travaillez avec Laravel 5, consultez ce pack par laracasts:

https://github.com/laracasts/flash

7
répondu user2321279 2015-02-02 13:25:20

vous pouvez faire un message multiple et avec différents types. Suivez les étapes ci-dessous:

  1. créer un fichier: " 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. sur votre contrôleur de base" 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;
}

cela mettra le caractère FlashMessages à la disposition de tous les contrôleurs qui étendent cette classe.

  1. créer un modèle de lame pour nos messages: " 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() "la méthode" 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);
      });
    }

    ...
}

ceci mettra la variable $messages à disposition de " views/partials/message.blade.php " template à chaque fois qu'elle est appelée.

  1. sur votre modèle, comprennent nos messages modèle - " 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>

vous avez seulement besoin d'inclure le modèle de messages où vous voulez afficher les messages sur votre page.

  1. sur votre contrôleur, vous pouvez simplement faire ceci pour pousser les messages 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.');
  }

  ...

J'espère que ça vous aidera.

7
répondu clemquinones 2016-07-20 03:50:52

une Autre solution serait de créer une classe d'assistance comment créer des classes helper ici

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

, Alors vous pouvez le faire.

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

ou

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

et à votre avis

@if(Session::has('message'))
    {{Session::get('message')}}
@endif
5
répondu Ayobami Opeyemi 2017-05-23 12:18:36

pour mon application j'ai fait une fonction d'aide:

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

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

mise en page du message, 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

et importer chaque où montrer le message:

@include('main.layouts.message', [
    'status'    =>  session('status'),
    'message'   =>  session('message'),
])
3
répondu ivahidmontazer 2018-01-27 07:25:01

j'ai l'habitude de le faire

dans ma fonction store() j'ai mis une alerte de succès une fois qu'il a enregistré correctement.

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

dans ma fonction destroy (), je voulais colorer le rouge d'alerte afin de notifier que son supprimé

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

avis, nous créons deux alertes avec des noms flash différents.

et à mon avis, je vais ajouter de la condtion à quand le bon moment l'alerte spécifique sera appelée

@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

ici, vous pouvez trouver différents messages flash stlyes messages Flash dans Laravel 5

2
répondu Ikong 2015-11-26 13:07:11

vous pouvez utiliser des Macros Laravel.

vous pouvez créer macros.php dans app/helpers et inclure des routes.php.

si vous souhaitez mettre vos macros dans un fichier de classe à la place, vous pouvez regarder ce tutoriel: 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>';
});

dans votre contrôleur:

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

dans votre View

@if(Session::has('message') && Session::has('alert') )
  {{HTML::alert($class=Session::get('alert'), $value=Session::get('message'), $show=true)}}
@endif
2
répondu Digitlimit 2015-12-01 07:51:09

pas un grand fan des solutions fournies (c'est-à-dire: variables multiples, classes de helper, en boucle à travers 'peut-être des variables existantes'). Ci-dessous est une solution qui utilise à la place un tableau par opposition à deux variables séparées. Il est aussi facilement extensible pour traiter plusieurs erreurs si vous le souhaitez, mais pour la simplicité, je l'ai gardé à un message flash:

Rediriger avec message flash array :

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

sortie basée sur tableau contenu:

@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

non lié puisque vous pourriez avoir votre propre méthode de notification / plugin - mais juste pour la clarté-bootstrapNotify est juste pour initier bootstrap-notifier de 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"}});
}
0
répondu SupaMonkey 2018-08-12 12:52:31