ふたりはララベル (Laravel PHP Framework)

PHPフレームワークのLaravelの体験記を書いていきます。こんなタイトルのブログですが萌え系アニメは一秒たりとも観たことがありません。

Eloquentでcreateするときは割り当て許可が必要

Eloquentモデルを使ってcreateするときに、何も設定していないとMassAssignmentExceptionというエラーが出る。

【コントローラ側】

Comment::create(array('name' => 'John'));

【エラーメッセージ】

Illuminate \ Database \ Eloquent \ MassAssignmentException

name

これはEloquentでMass Assignmentの設定をしていないからだ。Mass Assignmentは適当な日本語訳がない。Laravel4の日本語ドキュメントでは「複数代入」と訳している。本ブログではわかりやすさ優先で「割り当て許可」とする。

とにかくEloquentのcreateで割り当てようとする値は、あらかじめEloquent側で割り当て許可を与えなくてはいけない。面倒だけどこれはセキュリティ上の仕様だ。

割り当て許可の方法には、ブラックリスト方式とホワイトリスト方式がある。

【ブラックリスト方式】

class User extends Eloquent {

  protected $guarded = array('id', 'year');

}

上記のように$guarded変数に配列を設定した上でprotectedすれば、「id」と「year」以外の要素を、createから渡すことができる。ブラックリスト方式は$guarded(保護)を使う。

ホワイトリスト方式】

class User extends Eloquent {

  protected $fillable= array('name','age');

}

割り当て許可を与えたい要素が少ないなら、ホワイトリスト方式もある。上記のように$fillable(代入可能)に配列を設定した上でprotectedすれば、「name」と「age」だけをcreateから渡すことができる。