저는 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 문이 필요합니다.
조언을 부탁드립니다.
답변
한 가지 해결책은 두 개의 변수를 세션에 플래시하는 것입니다.
- 메시지 자체
- 경고의 “클래스”
예를 들면 :
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() }}
답변
여러 메시지를 다양한 유형으로 만들 수 있습니다. 아래 단계를 따르십시오.
- 파일 만들기 : ”
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); } }
- 기본 컨트롤러 ”
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
이 클래스를 확장하는 모든 컨트롤러 에서 특성을 사용할 수 있습니다.
- 메시지에 대한 블레이드 템플릿을 만듭니다. “
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
- 의 위에 “
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
“템플릿 에서 변수를 사용할 수 있습니다 .
- 템플릿에 메시지 템플릿을 포함하세요- “
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>
페이지에 메시지를 표시하려는 위치에 메시지 템플릿 만 포함하면됩니다.
- 컨트롤러에서 다음과 같이 간단히 플래시 메시지를 푸시 할 수 있습니다.
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"}});
}