2016-11-28 12 views
0

私はLaravel Eloquentモデルで作業しており、継承の問題を抱えています。PHP Laravel親は子供からの動的静的パラメータを継承します

私はBaseModelクラスを持っています。それはprotected static $dynamicRelations = [];のパラメータを持ち、いくつかの方法でそれを処理します。

そして、この例ではBaseModelに拡張された複数のクラスがあります。PageModelEventModelとしましょう。

私は、このようなPageModel::setDynamicRelationなどのページモデルの動的な関係を、作成した場合、それは静的変数に代入します:

public static function setDynamicRelation($key, $callback) 
    { 
     static::$dynamicRelations[$key] = $callback; 
    } 

この方法では、私がモデルに動的な関係を追加することができます。したがって、私がPageModel::setDynamicRelation('banners', ...)を実行すると、PageModelのインスタンス上で、PageModel->bannersを呼び出して関係値を取得できます。

スタティックパラメータBaseModelにリレーションが保持され、他のモデルに継承されるという問題があります。したがって、PageModelにリレーションシップを設定してEventModelをインスタンス化すると、同じ関係が得られますが、これは正しくありません。

関係を子クラスに格納し、他のクラスに継承しないようにするにはどうすればよいですか?私。メソッドが呼び出されるクラスに$dynamicRelationsのコピーを格納する必要があるため、すべての子は同じ関係を共有しません。

ありがとうございます!

+0

なぜ動的なものを使用しないのがよいのですか? – jycr753

+0

@ jycr753これで拡張できますか?私はモジュールが他のモジュールを変更できるようにする必要がある構造を持っているので、 'PageBanners'というモジュールは' Page'モデルのコードを実際に変更することなく 'Page'モデルに動的関係を追加できます。 – Giedrius

+0

それは起こってはいけません。あなたの例では、 'EventModel'は' PageModel'の関係を得るべきではありません。二つの異なるインスタンスです。 – user3158900

答えて

1

これを示すテストはありますか?

だからあなたはあなたが子クラスで定義されている親クラスのLate Static Bindings

静的プロパティは、親モデルを拡張し、他の子インスタンスに伝播しないしたくないと述べています。たとえば、Illuminate\Database\Eloquent\Modelにはprotected static $globalScopes = [];というプロパティがありますが、のモデルにグローバルスコープを追加すると、配列$dynamicRelationshipsと同じようにこの配列にプッシュされますが、これらのインスタンスはModelのクラスに反映されません。

See Laravel's implementation of this here

+0

'static :: class'を配列キーとして保持するよりも洗練された解決策がありますが、フレームワークがそのようにしている場合は十分に良いものでなければなりません。これは本当にありがとう! – Giedrius

関連する問題