2015-01-26 52 views
2

在Laravel中创建基本模型时,我扩展了Eloquent类,以便我的模型具有所有令人敬畏的Eloquent功能。例如:Laravel在创建模型时扩展了口才

class Product extends \Eloquent { 
    //class definition here 
} 

我一直在读通过Laravel框架源代码,我不明白的地方这Eloquent类实际上来自。我可以看到有一个Illuminate\Database\Eloquent\Model类,它似乎具有我期望从Eloquent类扩展的所有功能,但是我很困惑继承是如何工作的,因为我扩展了Eloquent而不是Illuminate\Database\Eloquent\Model

这是如何工作的?

回答

2

如果您查看文件“config/app.php”的内容,您会在文件底部找到“别名”键。这就是发动机罩下的所有魔法。 Laravel允许你别名类,你也可以将它添加到“config/app.php”文件中,这样你就不必在代码中使用长且完全限定的名字。

正如你所看到的,你正在扩展的实际类是“Illuminate \ Database \ Eloquent \ Model”,它的别名为“Eloquent”,因此你只需要扩展“Eloquent”。

+0

这个别名是如何工作的?如果我扩展'Eloquent',那么PHP不会抛出类未找到类错误的错误?我试图找到实现这一目的的代码。 – flyingL123 2015-01-26 18:24:37

+0

我相信框架内部发生了很多事情,但这是一个起点。 查看供应商/ laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterFacades.php文件 '使用Illuminate \ Support \ Facades \ Facade; 使用Illuminate \ Foundation \ AliasLoader; 使用Illuminate \ Contracts \ Foundation \ Application; Facade :: setFacadeApplication($ app); AliasLoader :: getInstance($ app ['config'] ['app.aliases']) - > register();' – 2015-01-26 18:29:06

+0

谢谢。在'config/app.php'中的这个数组中,我还看到了'SoftDeletingTrait'=>'Illuminate \ Database \ Eloquent \ SoftDeletingTrait'的条目。如果存在这种情况,为什么我需要使用软删除特性将此行包含在每个模型的顶部? '使用Illuminate \ Database \ Eloquent \ SoftDeletingTrait;'。我不应该只在模型中使用SoftDeletingTrait;而不需要导入命名空间? – flyingL123 2015-01-26 18:33:00