こんにちは、エリカです。
Laravel をさらっと使って、カンタンなお問い合わせフォームを作ってみます。
環境は、Laradock + Laravel です。前回の記事を参考にセットアップしてください
 
        PHPフレームワーク「Laradock」で、手軽にLaravel+Dockerな開発環境を構築する
Laravel ではもはや Model という言葉があまり出てこないのですが、便宜的におなじみ MVC な感じで進めていきます。
お問い合わせ用モデルクラスの作成
今回はデータベース抜きで話を進めますが、まずは「お問い合わせ」というモデルクラスを作ります。したがって、ビューやコントローラでは、この「お問い合わせ」というモデルを主に取り扱います。
また、今回は言語設定も省いていますので、全て英語で処理していきます。後ほど、日本語の対応方法なども紹介していければと思います。
というわけで「 Contact 」という名前でモデルを作ります。
まずは、各種 docker コンテナを起動してください。
laradockディレクトリに入って、以下のコマンドでしたね。
$ docker-compose up -d nginx mysqlそして「 workspace 」コンテナに入ります。
$ docker-compose exec workspace bashここで、artisan を使ってモデルを作成します。
$ artisan make:model Contact<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Contact extends Model
{
    //
}このような app/Contact.php というファイルが作成されていると思いますので、この中身を編集します。
「名前」「メールアドレス」「メッセージ」といった内容を扱うお問い合わせフォームにしておきます。
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Contact extends Model
{
    protected $fillable = [
        'name',
        'email',
        'message',
    ];
}ひとまず以上です。
お問い合わせ用コントローラクラスの作成
artisan を使ってコントローラを作ります。
$ artisan make:controller ContactController<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class ContactController extends Controller
{
    //
}app/Http/Controllers/ContactController.php
こんなファイルができます。
アクションは、入力画面の表示、確認画面の表示、完了画面の表示になります。
メソッドを生やします。
<?php
namespace AppHttpControllers;
use AppContact;
use IlluminateHttpRequest;
class ContactController extends Controller
{
    public function form()
    {
        return view('form');
    }
    public function confirm(Request $request)
    {
        $contact = new Contact($request->all());
        return view('confirm', compact('contact'));
    }
    public function process(Request $request)
    {
        return view('complete')
    }
}次にRouteを設定します。
routes/web.php
Route::get('/contact', 'ContactController@form');
Route::post('/contact/confirm', 'ContactController@confirm');
Route::post('/contact/process', 'ContactController@process');入力画面はGET。それ以外はPOSTになります。
お問い合わせ用ビューの作成
ビュー作ります。
laravel標準では、ビューの保存場所は、resources/views になります。
ここに、こんな感じでファイルを用意します。
入力画面 – form.blade.php
<form action="{{action('ContactController@confirm')}}" method="post">
<input type="text" name="name">
<input type="text" name="email">
<textarea name="message"></textarea>
<input type="submit" value="Confirm">
</form>
確認画面 – confirm.blade.php
<form action="{{action('ContactController@process')}}" method="post">
{{$contact->name}}
{{$contact->email}}
{{$contact->message}}
<input type="submit" value="Submit">
@foreach($contact->getAttributes() as $key => $value)
<input type="hidden" name="{{$key}}" value="{{$value}}">
@endforeach
</form>
完了画面 – complete.blade.php
Completeブラウザから /contact にアクセスしてみます。
入力画面が表示されるので、適当に入力して、確認画面に進むと、入力内容が表示されます。
完了画面への遷移も行えると思います。
これでベースができました。Laravelの機能を使って肉付けしていきます。
バリデーションの実装
バリデーションを実装します。
名前は必須。
メールアドレスは必須で、形式のチェックもしたいですね。
ContactControllerのconfirmメソッドの中身を変更します。
public function confirm(Request $request)
{
    $this->validate($request, [
        'name'  => 'required',
        'email' => 'required|email',
        'message' => 'present',
    ]);
    $contact = new Contact($request->all());
    return view('confirm', compact('contact'));
}$this->validate()
素晴らしいことに、このメソッドだけで、バリデーションを実施し、要件を満たさなければ、自動で元の画面へ戻します。また、その際に入力内容を復元できるようにしておいてくれます。
それでは、form.blade.phpも編集し、バリデーションエラー時はメッセージを表示するようにし、元の入力内容を復元するようにします。
エラーメッセージは $errors に格納されています。
@if ($errors->any())
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
@endif
<form action="{{action('ContactController@confirm')}}" method="post">
{{csrf_field()}}
<input type="text" name="name" value="{{old('name')}}">
<input type="text" name="email" value="{{old('email')}}">
<textarea name="message">{{old('message')}}</textarea>
<input type="submit" value="Confirm">
</form>また、old() は、元の入力内容を取り出してくれます。
それでは、エラーを発生させてみてください。
各種バリデーションの標準エラーメッセージが表示されたかと思います。
なお、バリデーションのもう少し詳しい説明については、以前紹介しているのでそちらをご覧ください。
「入力画面へ戻る」を実装する
確認画面を出した時に大変なのは、「入力画面へ戻る」の実装ですよね。
まずは、ビューに戻るボタンを用意します。
送信ボタンの前にもう一つボタンを用意します。
name属性を、例えば「action」として、valueをそれぞれ、「Back」と「Submit」にしておきます。クリックされた方の値がPOSTされるんですよね、たしか。
<input type="submit" name="action" value="back">
<input type="submit" name="action" value="submit">あとは、コントローラ側で、クリックされたボタンに応じた処理を実行します。
public function process(Request $request)
{
        // ※要バリデーション
        $action = $request->get('action', 'back');
        // 二つ目は初期値です。
        $input = $request->except('action');
        // そして、入力内容からは取り除いておきます。
        if($action === 'submit') {
            // メール送信処理などを実装
        return view('complete');
        } else {
            // 戻る
            return redirect()->action('ContactController@form')
->withInput($input);
    }
}これで、戻るボタンを押した場合は、入力内容を保持した入力画面へ遷移するようになります。
そして、入力画面のビューでは、バリデーション実装時にすでに、入力内容を復元するように準備してあるので、そのまま、入力内容が復元されます。
送信ボタンを押せば、そのままこれまで通りに完了画面ですね。
あとは、完了画面表示前に、メール送信なりデータの保存なりを実装するだけですが、次回に詳しくご紹介できればと思います。
まとめ
今回は本当にカンタンですが、Laravel のモデル、コントローラー、ビューをご紹介しました。次回以降、それぞれ、掘り下げていきたいと思います。
それでは。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。
 
     
        

 
                         
                                 
                         
                                 
                         
                                 
                         
                                 
                             
                            