LaravelではCakePHPと異なりValidationルールをControllerに記述する例が多い
LaravelでVaidateルールをModelに記述する方法
LaravelのValidationルールをModelにコーディングして、
Controllerからバリデーションチェックする方法です。REST APIを構築した際には、バリデーションルールをControllerに記述したのですが、Modelに記述することも可能です。
Webで検索したところ
Trick: Validation within models
上の記事がValidationをModelにコーディングする上で、シンプルに実現できるし参考になった。リンク先のコードをLaravel4.2で利用してみた。
Model
class Todo extends Eloquent { protected $table = 'todos'; private $rules = array( 'title' => 'required|min:3', ); private $errors; public function validate($data) { $v = Validator::make($data, $this->rules); if ($v->fails()) { // この部分注意 $this->errors = $v->errors(); return false; } return true; } public function errors() { return $this->errors; } }
Controller
Model側にValidationルールを移すことができたので、Controller側(REST APIの登録処理)でバリデーションチェックを試したのが以下のコード。
public function postNew() { $t = new Todo(); $input = array('title' => Input::get("title")); if ($t->validate($input)) { $t->title = Input::get("title"); $t->save(); $last_todo = $t->id; $todos = Todo::whereId($last_todo)->get(); $response = Response::json(array( 'status' => 'OK', 'data' => $todos[0] ), 201); } else { $message = $t->errors(); $response = Response::json(array( 'status' => 'ERROR', 'message' => $message ), 409); } return $response; }
Laravel4.2の環境で動かすことができた。
Model Observerを利用してValidationをControllerから追い出す
LaravelのModelにはObserverとしてModelを拡張できるようで、サンプルを公開している記事があった。
Laravel Model Validation using Observers
試してみたろころ、手元のLaravel4.2環境では、Model Observerによるバリデーションチェックは動作を確認できなかったものの、この方法を用いれば、Modelのsaveメソッドにバリデーションチェックを関連付けることが可能になる模様。
Model Observerについての記事として
Exact place to register observer in laravel 4
もあります。
そのほか、LaravelのModel内Validationについては、
Pros and Cons of different kinds of validation?
上の記事も参考になります。