Laravel – モデルのcreate()メソッドはどこに?

Modelにcreate()メソッドがない

LaravelのUserや作成したモデルで呼び出すcreate()メソッドについて調べた過程。

たとえばLaravelでモデルとコントローラーをPostPostControllerのように生成し、store()アクション内でマスアサインメントによってデータを登録する場合に、以下のように書き、モデルクラスのスタティックメソッドcreate()を呼び出している。

ここでPostモデルのクラスを見てみると、EloquentModelクラスを継承している。

ところがIlluminate\Database\Eloquent\Modelクラスなどをたどってみても、create()メソッドが見当たらなかった。

マジックメソッドで実装している

以下のように、Modelクラスではマジックメソッド__call()__callstatic()が定義されている。

まず、Post::create()が実行されると、

  1. Postクラスにはstatic create()がない
  2. 継承元のModelクラスにもstatic create()がない
  3. Model::__callstatic()が呼ばれる
  4. new staticがlate static bindingで実行されてnew Post()と解釈される
  5. Postインスタンスにはcreate()がない
  6. 継承元のModelにもcreate()がない
  7. Model::__call()が呼ばれる

この__call()メソッドの動作はよくわかっていないが、create()の場合は最終的に以下が実行されるようだ。

forwardCallTo()ModeluseしているForwardsCallsトレイトのメソッドを呼んでいるが、要するにnewQuery()の戻り値のオブジェクトで定義されている$method(この場合はcreate())を呼んでいる。

ここからどんどん複雑になっていくので手に負えなくなるが、参考サイトを拝見するとEloquent\Builderというクラスのインスタンスが戻り値になるようで、その中にcreate()が定義されていた。

参考サイト:【Laravel】 第1回 Eloquent ソースコードリーディング – モデルの取得

尻切れトンボになってしまうが、ひとまずここまで。

 

コメントを残す

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