2012年10月21日日曜日

scaffoldで生成されたコードでvalidationを出すと... #fuelphp

FuelPHPでアプリケーションを作成する場合 oil generate の scaffolding というのを使うと一発で一覧、作成、編集画面を作ってくれます。
$ php oil g scaffold article title:nvarchar[45] body:text

上のようなコマンドを実行するだけでコントローラ、モデル、ビュー、マイグレーションを作成してくれます。
便利だなと思ってさわってみたら作成画面とかで validation エラーを出すと下のようなエラーが表示されてしまいました。
Fatal error: Uncaught exception 'Fuel\Core\FuelException' with message 'The session data stored by the application in the cookie exceeds 4Kb. Select a different session storage driver.

クッキーの容量オーバー??4KB??

scaffoldで生成されたコントローラを見ると
$val = Model_Article::validate('create');
if ($val->run())
{
    (省略)
}
else
{
    Session::set_flash('error', $val->error());
}

validation で例外が発生した場合、$val->error() をセッションに格納しています。
ドキュメントを見てみると「バリデーションエラーをフィールドとエラー内容の組の配列で取得する」と書かれてましたが実際に出力されている内容がわからなかったのでセッションのドライバをファイルにしてみました。

変更のやり方は下のサイトが参考になります。
Fuelphp、セッションをファイルやDBに切り替える

修正箇所は2箇所。
core/config/session.php を app/config/session.php にコピーして
return array(
    'driver' => 'file',

    (省略)

    'file' => array(
        'cookie_name'     => 'fuelfid',
        'path'            => APPPATH.'/tmp',
        'gc_probability'  => 5
    ),

    (省略)
);

これで validation エラーを再度発生させてみると、エラー表示はでなくなりました。
実際に出力されたファイルを見てみるとHTMLのソースとか何とかがでてきました。ファイルサイズを見てみると7KB。。。
確かに4KB超えてる。。。

実際のプロジェクトとかで scaffold で生成されたコードをそのまま使うということはほとんどないと思いますが、セッションのドライバを変えるか。。。もしくは以下のようなかんじでエラー内容だけを出力するように修正。
$val = Model_Article::validate('create');
if ($val->run())
{
    (省略)
}
else
{
//    Session::set_flash('error', $val->error());
    Session::set_flash('error', $val->show_errors());
}


これでOK。

oil generate は scaffolding みたいに一気にすべてを生成するだけじゃなくてコントローラとかモデルとかそれぞれで生成することができるので便利は便利です。

詳しくはドキュメントを
Genarate - Oil Package - FuelPHP Documentation




0 件のコメント:

コメントを投稿