2

Laravel コントローラーでPost/Redirect/Get (PRG)パターンを使用して、フォームの送信が重複しないようにしています。

レイアウトを使用しない場合、またはレイアウトで変数を使用しない場合にうまく機能します。問題は、レイアウトが という名前の変数を使用していることです$title。リダイレクトなしでビューとレイアウトをロードするとうまく動作し、コントローラーに設定されたタイトルがレイアウトに渡されますが、フォームを処理し、同じレイアウトと同じコントローラーメソッドを使用する同じルートにリダイレクトした後、レイアウト ファイルからの「未定義の変数: タイトル」エラー。

これが私のコードです:

ファイル: app/routes.php

Route::get('contact', array('as' => 'show.contact.form', 'uses' => 'HomeController@showContactForm'));
Route::post('contact', array('as' => 'send.contact.email', 'uses' => 'HomeController@sendContactEmail'));

ファイル: app/controllers/HomeController.php

class HomeController extends BaseController {

    protected $layout = 'layouts.master';

    public function showContactForm()
    {
        $this->layout->title = 'Contact form';
        $this->layout->content = View::make('contact-form');
    }

    public function sendContactEmail()
    {
        $rules = ['email' => 'required|email', 'message' => 'required'];
        $input = Input::only(array_keys($rules));
        $validator = Validator::make($input, $rules);

        if($validator->fails())
            return Redirect::back()->withInput($input)->withErrors($validator);

        // Code to send email omitted as is not relevant

        Redirect::back()->withSuccess('Message sent!');
    }
}

ファイル: app/views/layouts/master.blade.php

<!DOCTYPE html>
<html>
    <head>
        <title>{{{ $title }}}</title>
    </head>
    <body>
        @yield('body')
    </body>
</html>

ファイル: app/views/contact-form.blade.php

@section('body')
    @if (Session::has('success'))
        <div class="success">{{ Session::get('success') }}</div>
    @endif

    {{
        Form::open(['route' => 'send.contact.email']),
        Form::email('email', null, ['placeholder' => 'E-mail']),
        Form::textarea('message', null, ['placeholder' => 'Message']),
        Form::submit(_('Send')),
        Form::close()
    }}
@stop

リダイレクト後に次のコード行が無視される理由がわかりません

$this->layout->title = 'Contact form';

Redirect::action('HomeController@sendContactEmail');orで試してみましRedirect::route('show.contact.form');たが、結果は同じです。

そのビューのレンダリングを担当するコントローラーは、リダイレクト前とリダイレクト後ではまったく同じであり、ビジネス ロジックがまったくないのに、最初のケースでのみ機能し、2 番目のケースでは機能しないのはなぜですか?

4

3 に答える 3

0

使ってみましたか

return View::make('contact-form', array('title' => 'Contact Form'));

レイアウトを直接操作する代わりに?

于 2013-11-13T20:08:58.043 に答える