[session] Laravel에서 세션에서 다양한 유형의 플래시 메시지를 전달하는 가장 좋은 방법

저는 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을 사용하고 있는데 다른 메시지 클래스를 사용하고 싶습니다다시피 alert-info, alert-warning, alert-danger

컨트롤러에서 내가 설정하는 메시지 유형을 알고 있다고 가정하면 뷰에 전달하고 표시하는 가장 좋은 방법은 무엇입니까? 세션에 각 유형 (예 :)에 대해 별도의 메시지를 설정해야합니까 Session::flash('message_danger', 'This is a nasty message! Something's wrong.');? 그런 다음 블레이드 템플릿의 각 메시지에 대해 별도의 if 문이 필요합니다.

조언을 부탁드립니다.



답변

한 가지 해결책은 두 개의 변수를 세션에 플래시하는 것입니다.

  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클래스 이외의 것이되어야하는 경우에만 재정의하면됩니다 .

(그것은 빠른 예이며 테스트되지 않았습니다. :))


답변

귀하의 관점에서 :

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


답변

내 방법은 항상 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() }}


답변

여러 메시지를 다양한 유형으로 만들 수 있습니다. 아래 단계를 따르십시오.

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

    ...
}

그러면 호출 될 때마다 $messagesviews/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.');
  }

  ...

도움이 되었기를 바랍니다.


답변

추가 사용자 기능을 사용하지 않고 치료를 원하는 ‘플래그’로 간단히 반환하십시오. 컨트롤러 :

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

예, 정말 작동합니다!


답변

또 다른 해결책은 도우미 클래스를 만드는 것입니다.
여기에서 도우미 클래스를 만드는 방법

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


답변

제공된 솔루션의 열렬한 팬이 아닙니다 (예 : 여러 변수, 도우미 클래스, ‘가능한 기존 변수’반복). 아래는 두 개의 개별 변수가 아닌 배열을 대신 사용하는 솔루션입니다. 또한 원하는 경우 여러 오류를 처리하도록 쉽게 확장 할 수 있지만 단순성을 위해 하나의 플래시 메시지로 유지했습니다.

플래시 메시지 배열로 리디렉션 :

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