Laravel でテンプレート間で値を渡すにはどうすればよいですか?[閉まっている]

StackOverflow https://stackoverflow.com//questions/25007377

  •  20-12-2019
  •  | 
  •  

質問

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 方法。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top