マジックゲッター/セッター用のプラグイン


9

ユーザーのレビューをMagento 2のフロントエンドに投稿したときではapprovedなく、レビューのステータスを作成しようとしています 。このアプローチを採用しました。このように見えるのメソッドのために、フロントエンド領域でのみ利用可能なbeforeプラグインを作成しますpending
setStatusIdMagento\Review\Model\Review

public function beforeSetStatusId(\Magento\Review\Model\Review $review, $status)
{
    return [\Magento\Review\Model\Review::STATUS_APPROVED];
}

それは良い考えのように私に縫い合わせました。承認済みのステータスを返すので、問題なく機能するはずです。実際のメソッドは、これをパラメーターとして取得する必要があります。
驚いたことに、それはうまくいきませんでした。
それから私は掘り下げて、メソッドsetStatusIdがレビューモデルに存在しないことを発見しました。それは魔法のように呼ばれ、実際に実行されsetData('status_id', $status)ます。
次に、生成されたインターセプターを調べましたが、実際にはsetStatusIdメソッドはありません。

magento 2でマジックゲッター/セッターをプラグインするにはどうすればよいですか?それは可能ですか?

注:レビューを自動承認するためのソリューションは必要ありません。私は、save_beforeイベントのような他のアプローチを取ることができることを知っています。これは今のところ重要ではありません。

回答:


14

それは可能ですか?

はい。

magento 2でマジックゲッター/セッターをプラグインするにはどうすればよいですか?

他のパブリックメソッドと同じように。di.xml設定でプラグインを宣言し、プラグインでカスタムコードを追加する必要があります。

public function before__call(\Magento\Review\Model\Review $review, $method, $args)
{
    if ($method == 'setStatusId') {
        if (isset($args[0])) {
            $args[0] = \Magento\Review\Model\Review::STATUS_APPROVED;
            return [$method, $args];
        }
    }
    //leave everything unchanged
    return null;
}

しかし、DTOクラスのプラグイン化は良い考えではありません。アプリケーションの動作を変更するために適切なコントローラー/サービスをカスタマイズし、DTOオブジェクトにプラグインを追加しないでください。このカスタマイズはアプリケーション層を破壊します。私はあなたが最も迅速かつ簡単な方法を使用していることを理解していますが、場合によってはそれは間違った戦略です。


カスタマイズについては同意します。これは単なる概念実証でした。
マリウス

@Mariusそうそう、かっこいい
最大

私はこのアプローチを採用しましたが、レビューモジュールがサービスコントラクトを使用するようにリファクタリングされると、失敗します。今のところ大丈夫です。ありがとう。
マリウス

はい、確かですが、あなたの質問は「magento 2で魔法のゲッター/セッターをプラグイン化するにはどうすればよいですか?それは可能ですか?」でした。最良のオプションは、パブリックAPIメソッドとサービスにのみプラグインを使用することですが、一部のmagentoモジュールにはAPIがないか、不十分です。
最大

4

私はかつて同様の問題を抱えていました。私は-メソッドをプラグイン化することになりましたsetData()が、私の意見では、リソースの途方もない無駄を生成します... :-(


OK。これは実用的なアプローチです。+1。しかし、私はよりクリーンなオプションを望んでいます(1つある場合)。
マリウス

同じことを望みます。この修正は非常に汚れているため、私は今でも毎晩眠るように泣いています。マジックメソッドがまだ残っているのは、Magento 1のレガシーコードが原因であると思います。レビューモデルがまだデータモデルにリファクタリングされていない限り、このモデルは運が悪いと思います。
Giel Berkers 2017

これはレガシーコードのせいだと気づきました。そして、私はこれから良い教訓を学びました。カスタムCRUDモジュールのマジックに依存しないでください。
マリウス

私がここで Maxによって説明されたアプローチを採用したのは、主に私のプラグインがマジックセッターが呼び出されたときにのみ呼び出され、すべてのsetData呼び出しに対して呼び出されないためです。完璧ではありませんが、を使用するよりも少し優れていsetDataます。多分あなたもあなたのアプローチを変えて、夜に少しよく眠ることができます。:)
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.