Laravel でテンプレート間で値を渡すにはどうすればよいですか?[閉まっている]
質問
Laravelフレームワーク4.1.30を使用しています。
ルートやコントローラーを経由せずに、あるテンプレートから別のテンプレートにデータを渡すにはどうすればよいでしょうか?
詳細:「サインイン」ブレード テンプレートによって拡張された「メイン」ブレード テンプレートを取得しました。私の目的は、「サインイン」テンプレートに表示されるエラーをすべて記録し、これを「メイン」テンプレートのフッター セクションに表示することです。
「body」タグ内のメインテンプレートのコードは次のとおりです(ビューをフォーマットするために間にいくつかのコードが存在することに注意してください)。
<!-- Serving as Header -->
@include('layout.navigation')
<!-- Serving as left content/status displays -->
@include('layout.frameleft')
<!-- Serving as right content/entry point -->
@yield('content')
<!-- Serving as Error Notification/footer -->
@if (Session::has('global'))
{{ Session::get('global') }}
@endif
Main を呼び出すブレード テンプレートは次のようにコーディングされます。
@extends('layout.main')
@section('content')
... more code here / input fields ...
{{ $errors->first('email')}}
... more code here / input fields ...
@stop
私が理解しているように(Laravelにはかなり初心者ですが)、セッション表示グローバルの前にコンテンツが最初に読み取られます。
テンプレート間で受け渡す単純な変数 (存在する場合) で問題を解決できることを期待していました。コントローラーに戻さずに、コンテンツからのエラー値をフッターセクション部分のメインテンプレートに戻したいと考えています。
コントローラーがテンプレートにエラーを出力するのを待つ代わりに、コントローラーからセッション (またはレイアウト) を介してエラーをグローバル変数に直接渡すことができるなど、回避策があることは承知しています。現在、次の作業コードは私が実装したものですが、データがすでにテンプレートに渡されていた場合はどうなるのか疑問に思っています。
public function postSignin() {
$validator = Validator::make(Input::all(),
array(
'email' => 'required|email',
'password' => 'required'
)
);
if ($validator->fails()) {
$errors = $validator->errors();
$formErrors = 'Errors: ';
foreach($errors->all() as $error ) {
$formErrors .= sprintf("%s", $error);
}
return Redirect::route('account-sign-in')
->withErrors($validator)
->withInput()
->with('global',$formErrors);
} else {
...more codes here...
なぜそうしているのかというと、もともとコントローラーでのコードは次のようなものだからです。
if ($validator->fails()) {
return Redirect::route('account-sign-in')
->withErrors($validator)
->withInput();
今ではとても大きく見えます。ループを使用してコントローラーを軽減できれば、プログラムはより効率的になるでしょう。
解決
から Laravelのドキュメント (彼らのことを強調して):
ただし、GET ルートのビューにエラー メッセージを明示的にバインドする必要がないことに注意してください。これは、Laravel がセッション データ内のエラーを常にチェックし、利用可能な場合は自動的にビューにバインドするためです。 したがって、次のことに注意することが重要です。
$errors
変数は、リクエストごとに、すべてのビューで常に利用可能になります, これにより、$errors 変数が常に定義されており、安全に使用できると便利に想定できます。の$errors
変数はのインスタンスになりますMessageBag
.
なぜならLaravelの Redirect... withErrors()
メソッドによってこれが行われるため、エラーを手動でセッションに再度追加する必要はありません。をチェックする代わりに、 if (Session::has('global'))
, 、これを行うだけです:
<!-- Serving as Error Notification/footer -->
@foreach ($errors as $error)
<p>{{ $error }}</p>
@endforeach
これは機能するはずです それでも それは中にあります layout
実際のビューではバインディングが適用されないため、 errors
テンプレートの内側では、テンプレートの外側にも適用されます。
エラーがない場合、Laravel はそのブロックをスキップします。エラーがある場合、エラーは自動的にバインドされます。 $errors
変数であり、期待どおりにレンダリングされます。
他のヒント
私はもともと推奨する回答を書いていました 作曲家を見る, 、しかし、その後、質問をもう一度読みましたが、あなたがしなければならないことは、フォーム検証を「フォーム」クラスに抽象化することであると思います。
interface FormInterface {
public function isValid($input);
public function errors();
}
あなたの質問から得た基本的なアイデアは、コントローラーを次のようにしたいということです。
public function postSignIn()
{
if(!$this->_signinForm->isValid(Input::all())) {
return Redirect::route('account-sign-in')
->withErrors($this->_signinForm->errors())
->withInput()
;
}
// Non-error logic branch
}
フォーム クラスには基本的にバリデータ オブジェクトへの参照が含まれます。全ての isValid
メソッドが行うべきことは基本的に呼び出すことです passes()
バリデーターとすべての error
メソッドは呼び出し結果を返すだけです errors()
バリデータ上で。
正直なところ、なぜ実際にすべてのエラーメッセージを単一の変数に結合しているのかわかりません。おそらく、すべてのエラーメッセージを同じ場所に表示したいためだと思います。その場合、エラーをそのように機能させたい場合は、それをフォームに組み込むことができます。 errors
方法。