私は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
お気づきかもしれませんが、私は自分のアプリでBootstrap 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() }}
あなたは複数のメッセージを異なるタイプで作ることができます。以下の手順に従ってください。
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
app/Providers/AppServiceProvider.php
"の "boot()
"メソッドについて: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
はい、それは本当にうまくいきます!
もしあなたがLaravel 5を使って作業しているなら、laracastsでこのパッケージをチェックしてください。
別の解決策は、ヘルパークラスを作成することです ここでヘルパークラスを作成する方法
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
私のアプリケーションのために私はヘルパー関数を作りました:
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'),
])
あなたはLaravel Macrosを使うことができます。
macros.php
にapp/helpers
を作成してroutes.phpを含めることができます。
マクロを代わりにクラスファイルに入れたい場合は、このチュートリアルをご覧ください。 http://chrishayes.ca/blog/code/laravel-4-object-oriented-form -html-macros-classes-service-provider
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">×</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
私は通常これをします
それが正しく保存されたら私のstore()関数で私は成功アラートを置きます。
\Session::flash('flash_message','Office successfully updated.');
destroy()関数で、アラートが削除されたことを通知するためにアラートを赤に着色したい
\Session::flash('flash_message_delete','Office successfully deleted.');
注意してください、我々は異なるフラッシュ名で2つの警報を作成します。
私の考えでは、特定のアラートが適切なタイミングで呼び出されるタイミングに条件を追加します。
@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のフラッシュメッセージ
提供されているソリューション(つまり、複数の変数、ヘルパークラス、 'おそらく既存の変数'のループ)の大ファンではありません。以下は、2つの別々の変数ではなく配列を代わりに使用するソリューションです。あなたが望むなら複数のエラーを処理することも簡単に拡張可能ですが、単純化のために、私は1つのフラッシュメッセージにそれを保ちました:
フラッシュメッセージ配列でリダイレクトする:
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は単にbootstrap-notifyをから開始することです 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"}});
}
コントローラー内:
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
私は以下がより少ないコード行でうまくいくと思う。
session()->flash('toast', [
'status' => 'success',
'body' => 'Body',
'topic' => 'Success']
);
私はトースターパッケージを使用していますが、あなたはあなたの見解でこのようなものを持つことができます。
toastr.{{session('toast.status')}}(
'{{session('toast.body')}}',
'{{session('toast.topic')}}'
);