Modelにcreate()メソッドがない
LaravelのUser
や作成したモデルで呼び出すcreate()
メソッドについて調べた過程。
たとえばLaravelでモデルとコントローラーをPost
、PostController
のように生成し、store()
アクション内でマスアサインメントによってデータを登録する場合に、以下のように書き、モデルクラスのスタティックメソッドcreate()
を呼び出している。
ここでPost
モデルのクラスを見てみると、Eloquent
のModel
クラスを継承している。
ところがIlluminate\Database\Eloquent\Model
クラスなどをたどってみても、create()
メソッドが見当たらなかった。
マジックメソッドで実装している
以下のように、Model
クラスではマジックメソッド__call()
、__callstatic()
が定義されている。
まず、Post::create()
が実行されると、
Post
クラスにはstatic create()
がない- 継承元の
Model
クラスにもstatic create()
がない Model::__callstatic()
が呼ばれるnew static
がlate static bindingで実行されてnew Post()
と解釈されるPost
インスタンスにはcreate()
がない- 継承元の
Model
にもcreate()
がない Model::__call()
が呼ばれる
この__call()
メソッドの動作はよくわかっていないが、create()
の場合は最終的に以下が実行されるようだ。
forwardCallTo()
はModel
でuse
しているForwardsCalls
トレイトのメソッドを呼んでいるが、要するにnewQuery()
の戻り値のオブジェクトで定義されている$method
(この場合はcreate()
)を呼んでいる。
ここからどんどん複雑になっていくので手に負えなくなるが、参考サイトを拝見するとEloquent\Builder
というクラスのインスタンスが戻り値になるようで、その中にcreate()
が定義されていた。
参考サイト:【Laravel】 第1回 Eloquent ソースコードリーディング – モデルの取得
尻切れトンボになってしまうが、ひとまずここまで。