プロジェクトを作った時に作られるファイルを眺めていて、モデルを見ていると
class User extends Eloquent implements UserInterface, RemindableInterface
ですと。
Eloquent
ってなんだ。
laravelが独自のORMのことをEloquent ORM
って呼んでいるのはわかる。(http://laravel.com/docs/eloquent)
しかし、Eloquent
なんていうクラスは存在しない。
なのにextendsしている。なぜ?ということで気になったので見てみる
上述のEloquent ORMのページで、User Modelが使っているメソッドや自動生成されているUser Modelが実装しているメンバ変数($table
とか$hidden
)を探してみるとどうやらModelというクラスにありそう。
探してみるとapp/config/app.php
に気になる記述を発見。
'aliases' => array( 'App' => 'Illuminate\Support\Facades\App', 'Artisan' => 'Illuminate\Support\Facades\Artisan', 'Auth' => 'Illuminate\Support\Facades\Auth', 'Blade' => 'Illuminate\Support\Facades\Blade', 'Cache' => 'Illuminate\Support\Facades\Cache', 'ClassLoader' => 'Illuminate\Support\ClassLoader', 'Config' => 'Illuminate\Support\Facades\Config', 'Controller' => 'Illuminate\Routing\Controller', 'Cookie' => 'Illuminate\Support\Facades\Cookie', 'Crypt' => 'Illuminate\Support\Facades\Crypt', 'DB' => 'Illuminate\Support\Facades\DB', 'Eloquent' => 'Illuminate\Database\Eloquent\Model', 'Event' => 'Illuminate\Support\Facades\Event', 'File' => 'Illuminate\Support\Facades\File', 'Form' => 'Illuminate\Support\Facades\Form', 'Hash' => 'Illuminate\Support\Facades\Hash', 'HTML' => 'Illuminate\Support\Facades\HTML', 'Input' => 'Illuminate\Support\Facades\Input', 'Lang' => 'Illuminate\Support\Facades\Lang', 'Log' => 'Illuminate\Support\Facades\Log', 'Mail' => 'Illuminate\Support\Facades\Mail', 'Paginator' => 'Illuminate\Support\Facades\Paginator', 'Password' => 'Illuminate\Support\Facades\Password', 'Queue' => 'Illuminate\Support\Facades\Queue', 'Redirect' => 'Illuminate\Support\Facades\Redirect', 'Redis' => 'Illuminate\Support\Facades\Redis', 'Request' => 'Illuminate\Support\Facades\Request', 'Response' => 'Illuminate\Support\Facades\Response', 'Route' => 'Illuminate\Support\Facades\Route', 'Schema' => 'Illuminate\Support\Facades\Schema', 'Seeder' => 'Illuminate\Database\Seeder', 'Session' => 'Illuminate\Support\Facades\Session', 'SoftDeletingTrait' => 'Illuminate\Database\Eloquent\SoftDeletingTrait', 'SSH' => 'Illuminate\Support\Facades\SSH', 'Str' => 'Illuminate\Support\Str', 'URL' => 'Illuminate\Support\Facades\URL', 'Validator' => 'Illuminate\Support\Facades\Validator', 'View' => 'Illuminate\Support\Facades\View', ),
aliases
とな
なるほどEloquentをModelのaliasにしていそうな感じがする。
しかしどうやっているのか。ちょっと見てみる
$config['aliases]'
を使っているのはlaravel/framework/src/Illuminate/Foundation/start.php
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Foundation/start.php#L180#L182
$aliases = $config['aliases']; AliasLoader::getInstance($aliases)->register();
(githubのlaravel/laravelでFoundation/start.phpが見つからず、この段階でlaravelがframeworkとかdatabaseとかいくつかのモジュールで構成されていることに気付いた)
さて、AliasLoader
の中で、autoload関数として自分自身のload関数を登録しています。
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Foundation/AliasLoader.php#L100
protected function prependToLoaderStack() { spl_autoload_register(array($this, 'load'), true, true); }
で、loadの中でclass_alias
というのを呼び出しています。(http://php.net/manual/ja/function.class-alias.php)
public function load($alias) { if (isset($this->aliases[$alias])) { return class_alias($this->aliases[$alias], $alias); } }
PHPは嗜む程度なのでこれは初めて知った。
これでEloquent
という存在しないクラスをextendsしている謎は解けました
Model
と読み替えてコードを読めば良いということでした。