【发布时间】:2014-09-03 02:09:39
【问题描述】:
我正在构建一个CMS package for Laravel。
我在这个包中的所有models 都绑定到 IoC 容器并从 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 都可以绑定到单个其他模型,例如页面或博客帖子。
为了以 Laravel 的方式实现这一点,我在 MenuItem 中添加了以下关系:
// \Angel\Core\MenuItem
public function linkable()
{
return $this->morphTo();
}
还有这种与LinkableModel 的关系,Page 和 BlogPost 等所有模型都扩展了这种关系:
// \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 的“页面”中解析,而不是硬编码到特定的命名空间类。
我的尝试:
根据this question,它应该像在linkable() 类中定义$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.
所以,我研究了 Eloquent,并认为我可能能够摆脱这样的事情:
// \Angel\Core\MenuItem
public function linkable()
{
return $this->morphTo(null, App::make($this->linkable_type));
}
...这感觉如此接近,但遗憾的是:Eloquent 在填充 MenuItem 的其余属性/列之前调用 linkable(),因此 $this->linkable_type 为空,因此不会从 IoC 解析任何内容。
非常感谢您提供的任何指导!
【问题讨论】:
标签: php mysql laravel laravel-4 eloquent