【发布时间】:2013-07-22 23:21:37
【问题描述】:
我想这样做:
// Model class
namespace Bookshop\Inventory\Model;
use Core\Inventory\Model\Product as BaseProduct;
class Book extends BaseProduct {
// ...
}
// Query class
namespace Bookshop\Inventory\Model;
use Core\Inventory\Model\ProductQuery as BaseProductQuery;
class BookQuery extends BaseProductQuery {
// ...
}
看起来不错,对吧?但是:
$book = BookQuery::create()->find($id);
var_dump(get_class($book));
// expected: Bookshop\Inventory\Model\Book
// actual: Core\Inventory\Model\Product
AFAIK 这是因为 Propel 的关系是在构建时定义的,而不是运行时...我发现实现这一点的唯一方法是使用 GlorpenPropelBundle 中的扩展行为并定义扩展我的配置中的类:
glorpen_propel:
extended_models:
Core\Inventory\Model\Product: Bookshop\Inventory\Model\Book
很好,它有效,但肯定有更好的方法吗?我错过了什么,或者这真的是在 Propel + Symfony 中扩展模型的唯一方法吗?我真的很想使用 Propel 而不是 Doctrine,但是这样的事情让我觉得 Propel 根本不适合超过一定规模的项目......
(Propel 1.6 + Symfony 2.3 顺便说一句)
【问题讨论】:
-
我怀疑 GlorpenPropelBundle 是您最好的选择。我遇到了无法扩展 Propel 模型的类似问题,通常我所做的是添加一个新类,该类在构造函数中采用基本模型。然后在查询类中,我们只获取原始模型,然后包装它们并返回它们。
标签: php symfony architecture doctrine-orm propel