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;
     }
}

しかし、これは理想的とは言えません。また、2番目の問題も解決しません。

4

1 に答える 1

0

ここでは、ニワトリが先か卵が先かという状況が少しあります。プル システム (あなたが提案したように) またはプッシュ システム (私がそうするように) を設計できますが、どちらもその特定の瞬間の状態のみをキャプチャします。この課題では、モデルが読み込まれるたびに定期的に更新する必要があります。

おそらく、中級クラスで解決できます。このクラスで、すべてのモデルのロード時にトリガーされる通知イベントを定義し、そのモデルの関係情報を渡します。すべてのモデルに更新イベント コールバックを登録させ、新しい情報が入ったときに通知機能がモデルを更新できるようにします。また、通知機能は、モデルが読み込まれる前に収集したすべてのデータを渡すことができる必要があります。すべてを同期させることは、かなりの挑戦になるでしょう。

関連モデルでクエリを実行したが、そのモデルにアクセスできない (つまり、リレーションが定義されていない) 場合、これらすべてが例外を防ぐわけではありません。

于 2012-09-03T12:01:38.370 に答える