LaravelのValidationをModel内にコーディングする

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?

上の記事も参考になります。

Laravelのデータベース接続を動的に変更

Webエンジニアブログにコメント

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

LaravelのValidationをModel内にコーディングするの記事にコメントを投稿