我正在构建一个CMS package for Laravel。Laravel雄辩和命名空间问题
此包中的所有models都绑定到IoC容器并从中解析出来,以便在包的任何单独部署中很容易覆盖它们。
对于非多态关系,这已经成为一种魅力。
例如,Page有很多PageModules,所以它的关系从:更改
// \Angel\Core\Page
public function modules()
{
return $this->hasMany('PageModule');
}
到:
// \Angel\Core\Page
public function modules()
{
return $this->hasMany(App::make('PageModule'));
}
但我一直无法弄清楚如何做同样的事情与多态关系。
例如,菜单包含MenuItems,并且每个MenuItem可以绑定到单个其他模型,例如Page或BlogPost。
要做到这一点的Laravel方式,我已经添加了以下关系菜单项:
// \Angel\Core\MenuItem
public function linkable()
{
return $this->morphTo();
}
而且这种关系LinkableModel,其全系车型,如网页和博客帖子延长:
// \Angel\Core\LinkableModel
public function menuItem()
{
return $this->morphOne(App::make('MenuItem'), 'linkable');
}
和menus_items
表(其中MenuItems使用)具有以下行:
linkable_type | linkable_id
-------------------|--------------
\Angel\Core\Page | 11
\Angel\Core\Page | 4
这很好,但我需要linkable_type
来说'页'而不是'\ Angel \ Core \ Page',并从IoC的'Page'中解析,而不是硬编码到一个特定的命名空间类。
我试了一下:
据this question,它应该是为定义$morphClass
属性可链接()类,像这样一样简单:
// \Angel\Core\Page
protected $morphClass = 'Page';
但当我申请这个,并改变menus_items
表看起来像这样:
linkable_type | linkable_id
---------------|--------------
Page | 11
Page | 4
...只要在MenuItem上调用linkable()时我只会得到一个Class 'Page' not found.
错误。
This is the exact line in Eloquent that throws the error.
所以,我挖成雄辩,我想我或许可以用这样的闪避:
// \Angel\Core\MenuItem
public function linkable()
{
return $this->morphTo(null, App::make($this->linkable_type));
}
......这种感觉如此接近,但很可惜:雄辩呼吁联()在填充MenuItem的属性/列的其余部分之前,因此$ this-> linkable_type为空,因此不会解析IoC中的任何内容。
非常感谢您提前接受任何指导!
你是一个天才。非常感谢你的帮助。你说我们不能传入null名称,因为它无法推断出来,但[这让我觉得我们可以!](http://laravel.com/api/source-class- Illuminate.Database.Eloquent.Model.html#523) – Leng
尽管我使用Laravel 4.1,它具有[此morphTo](https://github.com/laravel/framework/blob/2f1c6cd51dfd51d573977f07e34ba609cc0bf3ac/src/Illuminate/Database/Eloquent/ Model.php#L724)。 – Leng
老鼠!Quasdunk,当我急切加载这种关系时,它不再起作用,因为在这种情况下,$ this-> linkable_type确实为null。我猜想在加载时,Eloquent会在填写属性/列之前调用关系方法。 :(我会继续寻找一个可行的解决方案 – Leng