回答:
私はあなたが正しい解決策に来たと思う、ただ要約したい。
コンストラクターインジェクションを使用して、必要なクラスのヘルパー(またはその他のインスタンス)を取得する必要があります。
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()
シリアル化/逆シリアル化のためだけにあります。
helper
テンプレートで使用する場合、たとえば$this->helper('Magento\Catalog\Helper\Image')
、ベストプラクティスに従いますか?
Magentoの有望な人々は、新しい自動依存性注入システムを使用して、オブジェクトのコンストラクターを介してヘルパーとモデルをオブジェクトに取り込むようにしています。
ショートバージョン?あなたがオブジェクトマネージャによってインスタンスのオブジェクトを持っている、場合とはPHPDocでコンストラクタを飾る、およびパラメータ適切なタイプのヒントが設定されている、オブジェクトマネージャは、自動的にあなたのためのヘルパー(または、私は信じて、他のオブジェクト)をインスタンス化します。@param
たとえば、次のコンストラクターは、オブジェクトにコアデータヘルパーを挿入します。
/**
* @param \Magento\Core\Helper\Data $coreData
*/
public function __construct(\Magento\Core\Helper\Data $coreData)
{
$this->_coreHelper = $coreData;
}
ヘルパーがインスタンス化される方法(少なくとも新しいバックエンド(〜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');
get
か?