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


115

저는 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 문이 필요합니다.

조언을 부탁드립니다.


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() That will come in 매우 편리합니다.
Nick Coad 2014 년

1
대부분의 플래시 메시지 솔루션과 마찬가지로 이것은 하나의 메시지 만 처리합니다. 너무나 자주, 각각의 심각도가 다를 수있는 여러 메시지를 실행하고 모두 표시 할 수 있어야합니다.
제이슨


1
이건 너무 비생산적이야 ... 왜 모두가 찬성하는 거지?
Goowik

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 () 또는 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() }}

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

'Success'플래그를 사용했습니다.

보기:

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

예, 정말 작동합니다!


답변에 많은 오타가 있지만 접근 방식은 훌륭합니다.
Bat Lanyard

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을 뷰에서 코드로 가져 오기 때문에이 접근 방식을 권장할지 모르겠습니다.
Nick Coad 2014 년

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

나는 보통 이것을한다

내 store () 함수에서 제대로 저장되면 성공 경고를 표시합니다.

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

내 destroy () 함수에서 경고를 빨간색으로 표시하여 삭제되었음을 알리고 싶었습니다.

\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

Laravel 매크로를 사용할 수 있습니다.

route.php macros.php 에서 app/helpers만들고 포함 할 수 있습니다 .

대신 클래스 파일에 매크로를 넣으려면이 자습서를 참조하십시오. 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

className을 어떻게 전달합니까?
Boss COTIGA

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

Bootstrap Alert를 사용하여보기를보다 대화 형으로 만들고 싶은 경우. 다음과 같이 할 수 있습니다.

귀하의 기능에서 :-

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.