FuelPHP ORM模块/包交互/挂钩

FuelPHP ORM模块/包交互/挂钩,php,orm,hook,fuelphp,Php,Orm,Hook,Fuelphp,我正在寻找一种模块与使用FuelPHP的其他模块中的ORM模型交互的方法 例如,如果我有一个名为products的模块,它将附带一些默认行为,即从products表等中选择产品。这很好 我试图解决的问题是允许模块/包与产品模块交互,这些模块/包可能存在,也可能不总是存在 例如,如果启用了库存模块,则需要在产品模型中动态添加一个关系,以允许扩展模型_Product::find()->get(),以便在必要时检索库存信息。因此,上面的代码可以更改为 Model_Product::find()->

我正在寻找一种模块与使用FuelPHP的其他模块中的ORM模型交互的方法

例如,如果我有一个名为
products
的模块,它将附带一些默认行为,即从products表等中选择产品。这很好

我试图解决的问题是允许模块/包与产品模块交互,这些模块/包可能存在,也可能不总是存在

例如,如果启用了
库存
模块,则需要在产品模型中动态添加一个关系,以允许扩展
模型_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;
     }
}

但这似乎不太理想。这也不能解决第二个问题。

这里有点鸡和蛋的情况。你可以设计一个拉动系统(如你所建议的)或者一个推动系统(如我所做的),但两者都只会捕获特定时刻的状态。这个挑战需要在模型加载时不断更新

也许你可以用一个中间类来解决这个问题。让此类定义一个通知程序事件,该事件由加载的每个模型触发,并传递该模型的关系信息。让每个模型注册一个更新事件回调,以便通知程序可以在收到新信息时更新模型。通知程序还应该能够传递它在加载模型之前收集的所有数据。保持一切同步将是一个相当大的挑战

如果您使用相关模型运行查询,但该模型不可访问(即未定义关系),所有这些都不会阻止异常