3

我正在寻找一种让模块与使用 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;
     }
}

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

4

1 回答 1

0

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

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

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

于 2012-09-03T12:01:38.370 回答