magento2の__constructおよび_constructとは何ですか?


回答:


17

Magento 1とMagento 2の間で変更されたかどうかは完全にはわかりませんが、おそらくそうではないので、Magento 1で知っていることを使用します。

_construct後に呼び出されます__construct

PHPネイティブ__constructメソッドを上書きしたり、コードで使用したりしないでください。クラスの開始時に安全な方法でコードを実行する場合は、を使用します_construct

Magentoはネイティブ__constructを使用して、たとえば特定のモデルに適切なキャッシュタグを定義するなど、使用するクラスに対してすべてが「準備完了」であることを確認します。


15

_constructの方法だった「Varienの発明」モデル、ヘルパーやブロックにいくつかの初期化ロジックをラップするために使用されます。

したがって、Magentoファクトリーを常に使用するため、M1モデル/ブロックまたはヘルパーでネイティブ__construct()メソッドを変更または再宣言することはまれです。ただし、それを使用することについての問題/悪い練習ではありません(互換性を気にする場合)。

M2では_construct()メソッドが一部に存在し、同じ目的で使用されますが、現在(M2では)すべてのDIロジックが__constructor()によって実装されているため、コードベースで多くの構成体宣言を見つけることができます。

ところでMage::getModel()、M2のような工場はもうありません。

言い換えると:

_construct()メソッドは、いくつかのクラスにMagentoので実装され、それは内部で自動的に呼び出されます__constructのあなたは、オブジェクトの作成後にいくつかのものを実行するためにそれを使用することができますモデルのようなMagentoのクラスを拡張しているのであれば、関数宣言。

リソースモデルまたはモデルクラスで_construct()は、テーブルとprimary_keyを定義するためにメソッドを定義する必要があります

一方、__ constructはPHPのネイティブメソッド(すべてのOO言語にあります)で__constructあり、オブジェクトをインスタンス化するたびに呼び出されます。それで全部です

例:

Magento \ Framework \ Model \ ResourceModel \ AbstractResource

/**
 * Abstract resource model
 */
abstract class AbstractResource
{
    /**
     * Main constructor
     */
    public function __construct()
    {
        /**
         * Please override this one instead of overriding real __construct constructor
         */
        $this->_construct();
    } ...

Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb

/**
 * Class constructor
 *
 * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
 * @param string $connectionName
 */
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
    $this->transactionManager = $context->getTransactionManager();
    $this->_resources = $context->getResources();
    $this->objectRelationProcessor = $context->getObjectRelationProcessor();
    if ($connectionName !== null) {
        $this->connectionName = $connectionName;
    }
    parent::__construct();
}

例を挙げていただけますか?
ZED黒ひげ

M2で?、私はより多くの違いを明確にするために答えを向上させることができますが、一例が必要な場合、私は知らない
MauroNigrele

DIと__construct()に関連する何かについてのあなたの意見に興味があります。Magento2のいわゆる「DIロジック」は、実際には密結合を作成するため、アンチパターンとして実装されているようです。モジュールで拡張した3dパーティモジュールの数に応じて作曲家の更新を実行すると、多くの場合、アプリケーションを実行し続けるためだけに、子クラスで実際には使用されない、コンストラクターにパラメーターを追加してデバッグする必要があります。「依存性注入」とも呼ばれるべきかどうかは
わかり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.