30
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LaravelAdvent Calendar 2013

Day 4

Model で Validation したい? それならば Ardent だ!

Last updated at Posted at 2013-12-03

はじめに

はい、4日めです。引き続き @localdisk です。よろしくお願いします。

本日は Model で Validation を行うパッケージ Ardent のご紹介。

Validation のおさらい

その前に Laravel の Validation についておさらいしておきましょう。

Laravel の Validation は大体こんな感じ。ほとんどの場合で Controller か、routes.php に書くことになると思います。

// ルール
$rules = [
    'username' => 'required|alpha_dash|unique:users',
    'email'    => 'required|email|unique:users',
    'password' => 'required|between:4,11|confirmed',
    'password_confirmation' => 'between:4,11',
];
$validator = Validator::make($rules);

// Validation 作成
$validator = Validator::make($inputs, $rules);

if ($validator->fails()) {
    // Validation 失敗
    return Redirect::back()->withInput()->withErrors($validator);
}
if ($validator->passes()) {
    // ちなみにこれが成功
}

わかりやすい! fails passes というひと目見てわかるメソッド名が素晴らしいですね。こういうところが Laravel のよいところです。

Ardent の導入

まずは composer.json require セクションに下記を追加

{
    "require": {
        "laravelbook/ardent": "dev-master"
    }
}

そして composer update で OK. 他のパッケージだと必要な ServiceProvider Facade の登録は必要ありません。

基本的な使い方

まず、対象の Model を用意します。User という Model にしましょう。普通に作ると

class User extends Eloquent {}

こうなりますね。Ardent は

use LaravelBook\Ardent\Ardent;

class User extends Ardent {}

となります。継承するクラスを Eloquent から Ardent に変更します。そして Validation の定義はこう。

class User extends Ardent {
    public static $rules = [
        'username' => 'required|alpha_dash|unique:users',
        'email'    => 'required|email|unique:users',
        'password' => 'required|between:4,11|confirmed',
        'password_confirmation' => 'between:4,11',
    ];
}

はい、このように $rules フィールドに Validation ルールを記述するだけです。簡単ですね。このように記述すると Model の登録/更新時に Validation が適用されます。

一時的に、違うルール、メッセージを適用する

「基本的にはこれでいいんだけど、XX の場合だけ Validation 変更できない?」というケースも安心です。

save メソッドを呼び出すときに引数で渡すこともできます。

$rules = [
    'password' => 'required|between:4,11|confirmed',
];
$message = [
    'required' => 'パスワードを入れないとかどうかと思うよ。',
];
$user->save($rules, $message);

第1引数にルール、第2引数にカスタムメッセージを渡せば OK.

Validation を適用したくない

これもよくあるパターンですね。その場合はこうしましょう。

$user->forceSave();

余談ですが、初めて使った時にハマりました。ドキュメントの斜め読みよくない。

この Model だけ、違うメッセージを出したい

その場合は、Model に $customMessages を定義ます。

class User extends Ardent {
    public static $customMessages = [
        'required' => 'パスワードを入れないとかどうかと思うよ。',
    ];
}

更新時は unique を適用しない

Laravel の Validaton には unique というルールがあり、これは対象テーブルのカラムの内容が unique かどうかを検査します。
しかし、更新時はそのルールが邪魔になってしまいます。この場合、save(ユニークを外したルール) とすることもできますが updateUniques を使用するほうが
よりスマートです。

// 更新時、unique ルールを適用したくない場合
$user->updateUniques();    

以上、4日目は Ardent というパッケージを紹介しました。明日は日本の Laravel 神である @HiroKws さんです!

30
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?