Magento 2プロキシクラスのオーバーライド


8

\Magento\Catalog\Model\Product\Link正常に機能している設定を使用してクラスをオーバーライドする必要がありますが、上記のクラスには\Magento\Catalog\Model\Product\Link\Proxy、オーバーライドに追加された新しいメソッドが含まれていないプロキシクラスが自動的に生成されます。これらのメソッドをプロキシクラスに挿入する方法はありますか?

編集

私はこれを掘り下げてみましたが、di.xmlを使用してプロキシを注入できることがわかりました。しかし、そうしようとすると、クラスPackage\Module\Model\Class\Proxyが存在しないという例外が発生しました。つまり、私が生成しようとしている新しいプロキシが自動的に生成されていません。


Taral、Magentoインスタンスは開発者モードに設定されていますか?そうでない場合は、プロキシを生成するためにdiをコンパイルする必要があります。
Ivan Chepurnyi 2016年

なぜこのクラスにメソッドを追加するのですか?
カンディ

Ivan、私のmagentoインスタンスは開発者モードです
Taral Patoliya

@KAndy正確な機能を関連製品として追加する必要があるため、これを行うには、新しいリンクタイプのメソッドをいくつか追加する必要があります。私が気付いたのは、すべてのリンクタイプ(関連、クロスセル、アップセル)がそのクラスに独自のメソッドを持っていることです。
Taral Patoliya 2016年

手動でプロキシクラスを作成しdi.xml、設定を\Magento\Catalog\Model\Product\Link\Proxytoに設定できませんPackage\Module\Model\Class\Proxyか?
マリウス

回答:


5

あなたが述べたコメントを読んだ後:

私は同様のことをしました、そしてそれはうまくいきました。私はその解決策で解決しました。しかし、新しいメソッドが含まれた新しいプロキシクラスを生成したいと思いました。プロキシクラスは、クラスの初期化の負荷を軽減するために使用されます。プロキシクラスが使用されなくなったため、元のクラスはサーバーの負荷をさらに増やします。しかし、私はそれを無視できると思います。

あなたが解決しようとしている問題全体は、よりエレガントでアップグレードの手間がかからない方法で行うことができます。

既存の実装に新しいメソッドを追加しただけの場合は、元のクラスの動作を変更していないことを意味します

  1. オリジナルのクラスを依存関係として使用する独自のクラスを作成するために、既存のクラスのパブリックメソッドを拡張することは避けてください。
  2. 次に、元のクラスを使用していた場所にクラスを渡します

これにより、次のような副次的な利点が得られます。

  1. あなたはそれをテストするのがより簡単です(すべてのコア依存関係をモックすることに対する単一の依存関係)
  2. 単一責任の原則に違反しない
  3. 予期しない場所のコアには影響しません
  4. コア実装からビジネスロジックを分離します

2

Proxy.php次のコードをモジュールに追加することで、新しい関数を含む正しいファイルを生成できましたdi.xml

<type name="Magento\Catalog\Model\Product">
    <arguments>
        <argument name="productLink" xsi:type="object">Package\Module\Model\Product\Link\Proxy</argument>
    </arguments>
</type>

助けてくれて@minlareに感謝

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.