我正在寻找一种方法让模块使用FuelPHP与其他模块中的ORM模型进行交互。
例如,如果我有一个名为products
的模块,它将带有一些默认行为,从产品表等中选择产品。这很好。
我试图解决的问题是允许可能存在或可能不存在的模块/包与产品模块进行交互。
例如,如果我启用了inventory
模块,则需要在产品模型中动态添加关系,以允许扩展Model_Product::find()->get()
以在必要时检索库存信息。所以上面的代码可以改为
Model_Product::find()->related('inventory')->get()
这表明了另一个问题,即当库存模块尚未加载(并反过来创建关系)时,在代码中调用related('inventory')
会抛出异常。
从概念上讲,我正在努力寻找让模块互动的方法。
我相信我可以通过在模型中创建类似于下面的方法来解决第一个问题
public static function _init()
{
$data = array(
'_has_many' => static::$_has_many,
[...]
);
$additional_relationships = \Event::trigger('event_name', $data, 'array');
foreach($additional_relationships as $key => $value)
{
static::$$key = $value;
}
}
但这似乎不太理想。它也没有解决第二个问题。
你这里有鸡肉和鸡蛋的情况。你可以设计一个拉系统(就像你建议的那样)或推送系统(就像我会做的那样),但两者都只能捕捉到特定时刻的状态。这个挑战需要在模型加载时不断更新。
也许你可以用中间类来解决它。让此类定义一个通知器事件,该事件由每个模型on-load触发,并传递该模型的关系信息。让每个模型都注册一个更新事件回调,以便通知程序可以在新信息进入时更新模型。通知程序还应该能够在加载模型之前传递它已收集的所有数据。保持一切同步将是一个相当大的挑战。
如果您使用相关模型运行查询但该模型不可访问(即未定义关系),则所有这些都不会阻止异常。