लारवेल में, सत्र में विभिन्न प्रकार के फ्लैश संदेशों को पारित करने का सबसे अच्छा तरीका है


115

मैं लारवेल में अपना पहला ऐप बना रहा हूं और सत्र फ्लैश संदेशों के आसपास अपना सिर लाने की कोशिश कर रहा हूं। जहाँ तक मैं अपने नियंत्रक कार्रवाई में अवगत हूँ मैं या तो जा कर एक फ्लैश संदेश सेट कर सकते हैं

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 का उपयोग कर रहा है और विभिन्न संदेश वर्गों का उपयोग करने के लिए करना चाहते हैं: alert-info, alert-warning, alert-dangerआदि

यह मानते हुए कि मेरे नियंत्रक में मुझे पता है कि मैं किस प्रकार का संदेश सेट कर रहा हूं, इसे देखने और इसे प्रदर्शित करने का सबसे अच्छा तरीका क्या है? क्या मुझे प्रत्येक प्रकार (जैसे Session::flash('message_danger', 'This is a nasty message! Something's wrong.');) के लिए सत्र में एक अलग संदेश सेट करना चाहिए ? फिर मुझे अपने ब्लेड टेम्पलेट में प्रत्येक संदेश के लिए एक अलग विवरण की आवश्यकता होगी।

किसी भी सलाह की सराहना की।


itsolutionstuff.com/post/… मेरे लिए मददगार था।
रयान

जवाबों:


192

एक समाधान सत्र में दो चर को फ्लैश करना होगा:

  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() में सुपर काम आएगा।
निक कॉड

1
अधिकांश फ्लैश संदेश समाधानों की तरह, यह केवल एक संदेश से संबंधित है। इसलिए अक्सर, यह आवश्यक है कि संदेशों का एक गुच्छा बंद करने में सक्षम हो, प्रत्येक शायद एक अलग गंभीरता है, और उन सभी को प्रदर्शित किया है।
जेसन

2
यहाँ हम अपनी परियोजनाओं में क्या उपयोग कर रहे हैं gist.github.com/YavorK/7aa6e839dbe93e8854e4b033e31836a4
हॉप हॉप

1
यह इतना काउंटर उत्पादक है ... हर कोई इसे क्यों बढ़ा रहा है?
गोविक

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

  ...

आशा है कि यह आपकी मदद करेगा।


13

बस उस 'ध्वज' के साथ लौटें जिसे आप किसी अतिरिक्त उपयोगकर्ता फ़ंक्शन का उपयोग किए बिना इलाज करना चाहते हैं। नियंत्रक:

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

हाँ, यह वास्तव में काम करता है!


आपके पास अपने जवाब में एक टन टाइपो है, लेकिन आपका दृष्टिकोण बहुत अच्छा है।
चमगादड़ डोरी

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 को दृश्य से बाहर और कोड में ले जा रहा है।
निक कॉड

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 बस बूटस्ट्रैप-नोटिफ़िकेशन शुरू करने के लिए 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

मैं आमतौर पर ऐसा करता हूं

मेरे स्टोर () फ़ंक्शन में मैंने एक बार इसे ठीक से सहेजने के बाद सफलता की चेतावनी दी।

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

मेरे नष्ट () फ़ंक्शन में, मैं अलर्ट लाल रंग करना चाहता था ताकि यह सूचित किया जा सके कि इसके हटाए गए

\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

यहाँ आप Laravel 5 में अलग-अलग फ्लैश संदेश स्टाइल्स फ्लैश संदेश पा सकते हैं


3

आप लारवेल मैक्रोज़ का उपयोग कर सकते हैं।

आप बना सकते हैं 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')}}'
             );

2

नियंत्रक में:

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

या

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

ब्लेड में संदेश दिखाना ब्लेड के रूप में उर वांछित पैटर्न:

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

आप क्लासनेम कैसे पास करते हैं?
बॉस कोटिगा

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

यदि आप अपने दृष्टिकोण को अधिक इंटरैक्टिव बनाने के लिए बूटस्ट्रैप अलर्ट का उपयोग करना चाहते हैं। आप ऐसा कुछ कर सकते हैं:

अपने समारोह में: -

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.