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 番目のケースでは機能しないのはなぜですか?