Magento 2でのヘルパーのインスタンス化


26

Magento 2の最新ビルドは、このMageクラスを廃止しました。これは、Mage::helperメソッドを失ったことを意味します。

Magento 2でヘルパーをインスタンス化するための代替技術(ヘルパー工場?)はありますか?それとも私たちは、新しいオブジェクトマネージャクラスを使用して、ただでシングルトン/キャッシュされたオブジェクトとしてヘルパーをインスタンス化することが期待されているget(対create

回答:


31

私はあなたが正しい解決策に来たと思う、ただ要約したい。

コンストラクターインジェクションを使用して、必要なクラスのヘルパー(またはその他のインスタンス)を取得する必要があります。

class SomeClass
{
    public function __construct(\Magento\Core\Helper\Data $helper)
    {
        $this->helper = $helper;
    }

    public function doSmth()
    {
        $this->helper->someMethod();
    }
}

ことを予告なしPHPDOCコメントは必要ありません、Magentoのは、依存関係が必要とされているかを把握するために直接コンストラクタシグネチャを読み込みます。

\ Magento \ Core \ Helper \ Factoryは、多数のヘルパーを呼び出す必要がある場合、または必要なヘルパーが正確にわからない場合にのみ使用してください。

Object Managerを直接使用することは厳しくお勧めしません。使用しないでください:

\Magento\Core\Model\ObjectManager::getInstance()

シリアル化/逆シリアル化のためだけにあります。


PHPユニットでテストすることはできないため、staticは使用しないでください。使用しないでください。すべてのM2の依存関係がコンストラクタを介して行われ、内部オブジェクトマネージャによって管理され、シングルトンはまた、プロパティの可視性を示すために_使用していないとして、それを取得しますが、すべてのM2の命名はcamecaseを使用する必要があります
PartySoft

@Anton Krilをhelperテンプレートで使用する場合、たとえば$this->helper('Magento\Catalog\Helper\Image')、ベストプラクティスに従いますか?
コーアTruongDinh

2
いいえ、違います。テンプレートはブロックのみを参照する必要があります。ヘルパーを避ける必要があります
アントンクリル

10

Magentoの有望な人々は、新しい自動依存性注入システムを使用して、オブジェクトのコンストラクターを介してヘルパーとモデルをオブジェクトに取り込むようにしています。

ショートバージョン?あなたがオブジェクトマネージャによってインスタンスのオブジェクトを持っている、場合はPHPDocでコンストラクタを飾る@paramおよびパラメータ適切なタイプのヒントが設定されている、オブジェクトマネージャは、自動的にあなたのためのヘルパー(または、私は信じて、他のオブジェクト)をインスタンス化します。

たとえば、次のコンストラクターは、オブジェクトにコアデータヘルパーを挿入します。

/**
* @param \Magento\Core\Helper\Data $coreData
*/        
public function __construct(\Magento\Core\Helper\Data $coreData)
{
    $this->_coreHelper = $coreData;            
}

これは正解です-偉大な調査; たくさん掘った後でさえ、私には全く明らかではありませんでした。
-philwinkle

2
OK ...今、私の頭が痛い...たくさん。あなたはPHPDocを使用してコードを「書く」ことになっているということですか?これは狂気です。私は辞めた。
マリウス

@Marius haha​​haこれは珍しいことではありません-アランのブログはある程度それを説明しています。
-philwinkle

3
@philwinkle。彼の記事を読みました。非常に興味深いですが、私はまだこれが狂気だと言います。昔ながらの私を呼び出しますが、「昔の」コードはコードであり、コメントはほとんど誰も書くことを気にしませんでした。
マリウス

ああ...ところで。+1。良い質問といい答えです。
マリウス

7

上記のすべての回答とは別に、phtmlテンプレートでヘルパーを使用する必要がある場合は、次のようにするだけです。

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]');

誰かが前にそれを知らなかった場合に役立つことを願っています;)


6

ヘルパーがインスタンス化される方法(少なくとも新しいバックエンド(〜dev50)モジュールの場合)は、helperFactoryを使用します。

/**
 * Return helper object
 *
 * @param string $name
 * @return \Magento\Core\Helper\AbstractHelper
 */
public function helper($name)
{
    return $this->_helperFactory->get($name);
}

これは本質的に、モデルファクトリの特殊なタイプにすぎません。例:コンストラクターの一部としてのMagento \ Core \ Block \ Context行143(dev50):

\Magento\Core\Model\Factory\Helper $helperFactory

ヘルパーファクトリは、クラス名に基づいて要求されたモデルを返し、それがinstanceofヘルパー抽象クラスであることを確認します。

/**
 * Get helper singleton
 *
 * @param string $className
 * @param array $arguments
 * @return \Magento\Core\Helper\AbstractHelper
 * @throws \LogicException
 */
public function get($className, array $arguments = array())
{
    $className = str_replace('_', '\\', $className);
    /* Default helper class for a module */
    if (strpos($className, '\Helper\\') === false) {
        $className .= '\Helper\Data';
    }

    $helper = $this->_objectManager->get($className, $arguments);

    if (false === ($helper instanceof \Magento\Core\Helper\AbstractHelper)) {
        throw new \LogicException(
            $className . ' doesn\'t extends Magento\App\Helper'
        );
    }

    return $helper;
}

これを自分実装する場合、 Magentoコアは次の2つの方法のいずれかでロードしているようです。

自分の工場を転がす:

$objectManager = \Magento\Core\Model\ObjectManager::getInstance();

$helperFactory = $objectManager->get('\Magento\Core\Model\Factory\Helper');
$helper = $helperFactory->get('\PulseStorm\Commercebug\Helper\Data');

または、直接取得するだけです:

$helper = \Magento\Core\Model\ObjectManager::getInstance()->get('Magento\Core\Helper\Data');

1
有用な情報を得るために+1を使用しますが、そのように直接ファクトリをインスタンス化しますか?または、単一のヘルパーファクトリを、キャッシュされたクラスとしてObject Managerでインスタンス化する必要がありますgetか?
アランストーム

ヘルパーファクトリは\ Mage \ Core \ Block \ Abstractから継承されているため、完全に明確ではありません。意図は独自のヘルパーファクトリを提供することだと思います。しかし、彼らが意図的に工場のシングルトンを作成しているようには見えませ
-philwinkle

私が必要とする/最高のソースは、_helperFactoryがこれらのオブジェクトにどのように挿入されるかをトレースし、コアチームがどのようにインスタンス化するかを確認することです。
アランストーム

コンストラクターにはObjectManagerのインスタンスが必要なため、単純化の要約は正しくありません。すぐに編集します。
-philwinkle

編集を参照してください。これは動作するはずです。CLIシェル環境がストア構成インスタンスを期待どおりにロードしていないため、現時点では判断が困難です。ただし、これで正しい軌道に乗ることができます。
-philwinkle

0

この方法を試してください

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');

Object Managerを直接使用することは厳しくお勧めしません。
sv3n

@ sv3nを説明してもらえますか、理由は何ですか?ありがとう。
Thushan

1
活用の依存性の注入ではなく...例えばここに答え... magento.stackexchange.com/questions/142352/...
sv3n
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.