লারাভেলে, অধিবেশনটিতে বিভিন্ন ধরণের ফ্ল্যাশ বার্তা প্রেরণের সর্বোত্তম উপায়


115

আমি লারাভেলে আমার প্রথম অ্যাপটি তৈরি করছি এবং সেশন ফ্ল্যাশ বার্তাগুলির চারপাশে আমার মাথা পাওয়ার চেষ্টা করছি am আমার কন্ট্রোলার অ্যাকশনে যতদূর আমি সচেতন, আমি গিয়েই কোনও ফ্ল্যাশ বার্তা সেট করতে পারি

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

আপনি লক্ষ্য করে হতে পারে আমি আমার app এর মধ্যে বুটস্ট্র্যাপ 3 ব্যবহার করছি এবং বিভিন্ন বার্তা ক্লাস ব্যবহার করতে চাই: alert-info, alert-warning, alert-dangerইত্যাদি

ধরে নিচ্ছি যে আমার নিয়ামকটিতে আমি জানি যে আমি কী ধরণের বার্তা নির্ধারণ করছি, এটি দেখার এবং দেখার জন্য সর্বোত্তম উপায় কোনটি? আমি কি প্রতিটি ধরণের (উদাঃ Session::flash('message_danger', 'This is a nasty message! Something's wrong.');) এর জন্য সেশনে আলাদা বার্তা সেট করব ? তারপরে আমার ব্লেড টেম্পলেটটিতে প্রতিটি বার্তার জন্য আমার একটি পৃথক বিবৃতি প্রয়োজন।

কোন পরামর্শ প্রশংসা।


#Ustolvestuff.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
এটি এতটা উত্পাদনশীল বিরোধী ... সবাই কেন এটিকে সমর্থন দিচ্ছে?
Goowik

14
@ গুওইক - আরও উত্পাদনশীল সমাধান না দেওয়ার সময় এর পাল্টা উত্পাদনশীল কথা বলা উত্পাদনশীল is
সুপমনকি

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
আমি জানি না যে আমি এই পদ্ধতির প্রস্তাব দিচ্ছি কারণ এটি এইচটিএমএলটিকে ভিউ এবং কোডের বাইরে নিয়েছে।
নিক কোড

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

আপনার নিজের বিজ্ঞপ্তি পদ্ধতি / প্লাগইন থাকতে পারে বলে সম্পর্কিত নয় - তবে কেবল স্পষ্টতার জন্য - বুটস্ট্র্যাপনোটাইফাই কেবলমাত্র 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.');

আমার ধ্বংস () ফাংশনে, আমি সতর্কতাটিকে লাল রঙ করতে চেয়েছিলাম যাতে এটি মুছে ফেলা হয়েছে not

\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

লারাভেল 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

আপনি কিভাবে ক্লাসনেম পাস?
বস কোটিগা 13

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

বার্তা ফ্ল্যাশ করার জন্য আমি এই মার্জিত উপায়ে এসে পৌঁছেছি। এটি ল্যারেস্ট থেকে জেফরি ওয়ে তৈরি করেছিলেন। এটি দেখুন ... https://github.com/laracasts/flash


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.