Laravel3 を WebMatrix3 で開発しロリポップで公開する no.13 【Laravel3 の ORM は語る、そう雄弁に】

今回はようやくデータベースへの登録をしたいと思います。

まずは signup.php コントローラファイルを以下のように変更します。

<?php

class Signup_Controller extends Base_Controller
{
    public $restful = TRUE;

    public function __construct()
    {
        parent::__construct();
        $this->filter(\'before\', \'csrf\')->on(\'post\');
    }

    public function get_index()
    {
        return View::make(\'signup/index\');
    }

    public function post_index()
    {
        $rules = array(
            \'email\'    => \'required|email|unique:authentication\',
            \'password\' => \'required|confirmed\',
        );

        $v = Validator::make(Input::get(), $rules);
        if ($v->fails())
        {
            return Redirect::to(\'signup\')->with(\'signup_errors\', true);
        }
        else
        {
            $data = array(
                \'email\' => Input::get(\'email\'),
                \'password\' => Input::get(\'password\'),
                \'role\' => 1,
            );
            
            $message = \'\';
            try
            {
                $auth = Authentication::create($data);
                $message = \'登録完了\';
            }
            catch (Exception $e)
            {
                $message = \'登録失敗\';
            }

            return Redirect::to(\'signup/finish\')->with(\'message\', $message);
        }
    }

    public function get_finish()
    {
        return View::make(\'signup/finish\');
    }
}

signup.php のアクションを増やしたので、signup.blade.php を新たに views に作った signup ディレクトリに移動し、 index.blade.php にリネームしました。そしてどうディレクトリに finish.blade.php を作成しました。内容は以下のとおりです。

@if (Session::has(\'message\'))
{{ Session::get(\'message\') }}
@endif

そして、データベース関連の処理を任せるモデルを作成します。 application/models 以下に authentication.php を作成します。内容は以下のとおりです。

<?php

class Authentication extends Eloquent
{
    public static $table = \'authentication\';

    public function set_password($password)
    {
        $this->set_attribute(\'password\', Hash::make($password));
    }
}

ちなみに、モデルはクラス名に s をつけたテーブル名にデフォルトでアクセスします。今回は authentication なので別途指定しなければなりません (authentications にしておけばよかった)。なので $table メンバー変数に、対応するテーブル名を代入します。 set_password は password に値が代入された時に自動でハッシュ化するセッターメソッドです。

それでは signup.php の post_index メソッドの解説。バリデート後に処理を追加しました。$data 変数にデータベースに登録する内容を準備します。role はユーザに対する権限レベルを後々用意する予定で、一般ユーザは 1 ということにしました。 Authencication::create() に $data を渡すことでテーブルに INSERT してくれます。エラーが起こった場合は例外を投げますので、 catch 処理を追加しました。

入力フォームで起きたエラーを渡すときにも使っていましたが Redirect::to() のあとに with メソッドの第一引数にキー、第二引数に値を渡すことでリダイレクトでも値が渡せるフラッシュ保存が行われます。これは次のページが読み終わった時点で自動的にフラッシュされるのでリロードなどをされた場合は値が受け取れなくなります。

例外の有無にはかかわらず、 post_index 最後の処理で signup/finish にリダイレクトをします。

リダイレクトなので signup/finish には getで飛んできます。 よって実装は get_index のみ行います。内容は signup/finish.blade.php ビューを呼び出してるだけです。呼び出されたビュー側もフラッシュ保存された message の値を表示しているだけです。

それでは試しに登録してみてください。問題なく登録出来ましたら、 signup.php にある email のヴァリデート処理から unique を消し、同じメールアドレスで登録してみてください。例外が発生し、登録失敗の文字だけが表示されたページ(入力フォーム画面ではない)になればデータベースの例外処理も正常に稼働してます。

それでは今回はここまで。

カテゴリー: Laravel3, Web, WebMatrix, ロリポップ タグ: , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です