タグ付けされた質問 「dependency-injection」

Magento 2 Dependency Injectionに関する質問を示します

3
magento2でカスタムモジュールを作成すると致命的なエラーが表示される
magento 2でカスタムモジュールを作成する作業をしていますが、機能しません。どこが間違っているのか教えてもらえますか? 私のモジュールコード: app / etc / config.php: 'modules' => array ( 'Ramesh_Sample' => 1, ), app / code / Ramesh / Sample / etc / module.xml <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd"> <module name="Ramesh_Sample" schema_version="2.0.0"> </module> </config> app / code / Ramesh / Sample / etc / frontend / routes.xml …

1
誤った依存関係ScopeConfigInterfaceは、magento2のコンパイルのコンテキストオブジェクトにすでに存在します
<?php /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Ortho\Featuredproduct\Helper; use Magento\Framework\App\Helper\AbstractHelper; /** * Search helper */ class Data extends AbstractHelper { /** * @var \Magento\Framework\App\Config\ScopeConfigInterfac */ protected $_scopeConfig; protected $_config; protected $_storeManager; protected $_productFactory; CONST FEATURED_ENABLE = 'featured_settings/general/isenable'; CONST FEATURED_TITLE …

2
Magento 2のコンストラクターでのDIのクラスのトンに悩まされています-より良い方法はありますか?
現時点では、モジュール内で次のような類似のコンストラクターをまとめて作成することにイライラしています。 public function __construct( \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, /* ... */ \Foo\Bar\Model\Baz $baz, /* ... */ \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->registry = $registry; /* ... */ $this->baz = $baz; /* ... */ /* some awesome stuff */ } 多くの場合、多くの場合、モジュール全体で同じクラスのインスタンスが必要です。 したがって、必要なクラスを提供する1つまたは2つの中心的なヘルパークラスをすべてのコンストラクターで定義するのではなく、使用するのが許容できる方法であるかどうか、私は疑問に思っていました。 …

2
magento 2の単体テストのオブジェクトマネージャーを使用してScopeConfigInterfaceを取得する方法
ユニットテストの行をmagento 2データベースのcore_config_tableから読み取ろうとしています。このリンクを読んだので、この仕事を成し遂げることを知っています 。私は使用する必要があります: \Magento\Framework\App\Config\ScopeConfigInterface 使って: \Magento\Framework\TestFramework\Unit\Helper\ObjectManager これが私のコードです: protected function setUp() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->scopeConfig = $objectManager->getObject('\Magento\Framework\App\Config\ScopeConfigInterface'); } public function testgetImageCDNConfigValue() { $this->scopeConfig->getValue($this->path, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); if ($this->scopeConfig == null) { $this->assertFalse(true); } else { $this->assertTrue(true); } } testObjectを使用して必要なすべてのオブジェクトを取得できますが、取得したい\Magento\Framework\TestFramework\Unit\Helper\ObjectManagerときはいつでも\Magento\Framework\App\Config\ScopeConfigInterface 致命的なエラー:C:\ xampp \ htdocs \ magento \ vendor \ magento \ framework …

1
Magento 2統合テストのモックの依存関係
次のシナリオを想定します。 外部サービスを呼び出すクラスがあります クラスはインターフェースを実装し、このインターフェースの優先実装として di.xml ブロックは、コンストラクター・パラメーターとしてこのインターフェースを受け取ります このブロックを使用する統合テストでMagentoリクエストをテストしたい 私は実際に外部サービスを呼び出したくないので、そのクラスをモックして、それを行うための最良の方法は何だろうと思います。 私はあなたがオンザフライでDI設定を定義できることを知っています $objectManager->configure( ['preferences' => [TheInterface::class => MockClass::class]] ); しかし、これにはMockClass自分でモッククラスを定義する必要があります。PHPUnitモックオブジェクトを使用できません。 実際のモックオブジェクトを作成するモックファクトリを作成できるため、注入されたクラスがファクトリの場合、これは問題なく動作します。 しかし、これが唯一の方法ですか、それとも私は何かを逃していますか? 更新: 提案された方法 $objectManager->addSharedInstance($mock, TheInterface::class); 最初は見栄えが良かったが、設定が定義されていない場合にのみ機能した。これらは共有インスタンスよりも優先されます。 私は動的に設定を削除しようとしました: $this->objectManager->configure( ['preferences' => [TheInterface::class => null]] ); しかし、残念ながらMagentoはltrim($to, '\\')引数を呼び出し、それが空の文字列に変換します。これは結果として: ReflectionException:クラスが存在しない

2
構成を読み取るときのMagento2循環依存性
ScopeConfigInterface $scopeConfig特定のオブジェクトを拡張するときに使用できない di.xml <preference for="Magento\Framework\Logger\Monolog" type="Foo\Log\Logger\FooLog" /> <virtualType name="helper" type="Foo\Log\Helper\Data" /> <type name="Foo\Log\Logger\FooLog"> <arguments> <argument name="helper" xsi:type="object">Foo\Log\Helper\Data</argument> </arguments> </type> FooLog.php public function __construct( \Foo\Log\Helper\Data $dataHelper ) { $this->_scopeConfig = $scopeConfig; } Data.php public function __construct(ScopeConfigInterface $scopeConfig) { $this->_scopeConfig = $scopeConfig; } $this->_scopeConfig->getValue('dev/debug/foo_bar_config', 'default'); エラー: Circular dependency: Magento\Store\Model\ResourceModel\Config\Collection\Scoped depends on Magento\Store\Model\ResourceModel\Config\Collection\Scoped …

2
デメテルの法則違反を回避する方法(「新規オブジェクトは、注入可能なオブジェクトへのフィールド参照を保持してはなりません」)
依存性注入を使用するためのルールで、Magento 2 devdocsは次のように述べています。 Newableオブジェクトは、注入可能なオブジェクトへのフィールド参照を保持したり、コンストラクターでフィールド参照を要求したりしてはなりません。これはデメテルの法則違反です。 これは良い目標だと私は理解していますが、Magento 2モデルでこれを実際にどのように実現できますか? 新しいアーキテクチャの優れた例として示されているCustomerモジュールを見ると、顧客モデルコンストラクターのシグネチャは次のようになります。 public function __construct( \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Eav\Model\Config $config, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Customer\Model\ResourceModel\Customer $resource, \Magento\Customer\Model\Config\Share $configShare, \Magento\Customer\Model\AddressFactory $addressFactory, \Magento\Customer\Model\ResourceModel\Address\CollectionFactory $addressesFactory, \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder, GroupRepositoryInterface $groupRepository, \Magento\Framework\Encryption\EncryptorInterface $encryptor, \Magento\Framework\Stdlib\DateTime $dateTime, CustomerInterfaceFactory $customerDataFactory, DataObjectProcessor $dataObjectProcessor, \Magento\Framework\Api\DataObjectHelper $dataObjectHelper, \Magento\Customer\Api\CustomerMetadataInterface $metadataService, \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.