タグ付けされた質問 「object-manager」

7
Magento 2:ObjectManagerを直接使用するかどうか。
それでは、昨日、Magentoコミュニティの他の人たちとinクラス/テンプレートの直接的な使用ObjectManagerに関して大きな話をしました。 Alan Kentを引用して、ObjectManagerを直接使用しない理由をすでに知っています。 いくつかの理由があります。コードは機能しますが、ObjectManagerクラスを直接参照しないことがベストプラクティスです。 そう言うから!;-)(一貫性のあるコードは良いコードとして表現される方が良い) コードは、将来、異なる依存性注入フレームワークで使用される可能性があります テストが簡単になります。モックObjectManagerを提供することなく、必要なクラスのモック引数を渡すことができます。 依存関係をより明確に保ちます -コードの途中で依存関係を非表示にするのではなく、コンストラクターリストを介してコードが依存するものが明らかです カプセル化やモジュール化などの概念をプログラマーがよりよく考えるように促します -コンストラクターが大きくなった場合、コードがリファクタリングを必要とする兆候かもしれません StackExchangeで私が見たものから、多くの人々は、たとえば次のような簡単/短い/推奨されない解決策を求める傾向があります。 <?php //Get Object Manager Instance $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); //Load product by product id $product = $objectManager->create('Magento\Catalog\Model\Product')->load($id); 痛みを伴うが推奨されるプロセスを経る代わりに: モジュールを作成する 設定の宣言 依存関係を注入する パブリックメソッドを宣言する ただし、ジレンマが発生します。Magento2コアファイルは、多くの場合ObjectManagerを直接呼び出します。ここに簡単な例があります:https : //github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57 だからここに私の質問があります: なぜMagentoは私たちにしないことを勧めているのですか?それは、ObjectManager直接使用する必要がある場合があることを意味しますか?もしそうなら、それらのケースは何ですか? ObjectManagerを直接使用した結果はどうなりますか?

2
Magento 2-オブジェクトマネージャは、Abstractクラスをインスタンス化しようとします。( 致命的な誤り )
Magento 2で遊んでいるのに問題が発生した場合、頭を抱えることができません。オブジェクトマネージャは、Abstractクラスをインスタンス化しようとしますが、これにより致命的なエラーが発生します。誰かがこれを引き起こしたり、私を正しい方向に向けたりする原因を知っていますか? エラー Fatal error: Cannot instantiate abstract class Magento\Framework\Model\Resource\AbstractResource in /lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php on line 75 問題 私のモジュールには、を拡張するモデルがあり\Magento\Quote\Model\Quoteます。このモデルのコンストラクタには、これを挿入する次の行があります。 \Magento\Framework\Model\Resource\AbstractResource $resource = null,。 モデルをインスタンス化するコントローラーは、モデルをインスタンス化\Magento\Backend\App\Actionする$this->_objectManager->create()ために拡張し、使用します。 私が頭を包み込めないのは、Magentoモデルをインスタンス化すると動作するだけですが、モデルをインスタンス化すると、この抽象クラスをインスタンス化して上記のエラーをスローすることです。オブジェクトマネージャにこれを行うよう指示するものと、問題を解決する方法を教えてください。 私が最初に考えたのは、Magentoを使用di.xmlしてこれを置き換える、これまたは何かを実行することでした。 これを読んでくれてありがとう。この問題に関するヘルプまたは入力を歓迎します。

2
Magento 2のPHPUnit 4.1でPHP7コードを単体テストする適切な方法は何ですか?
モジュールを作成するとき、アプリケーションの最も重要な部分の単体テストをモジュールに提供しようとしています。ただし、現時点(Magento 2.1.3)では、単体テストの作成方法についていくつかの方法があります。 さまざまなテスト方法 それを統合し、bin/magento dev:tests:run unitMagentoにバンドルされているデフォルトのphpunit設定の上で実行します。 それらを別々にvendor/bin/phpunit app/code/Vendor/Module/Test/Unit記述し、実行して、Magentoであるすべてをモックします。 それらを個別に記述し、すべてをモックし、PHPUnitのシステムグローバルバージョンを使用します。 それらを別々に記述し、で実行しますがvendor/bin/phpunit、それでも利用し\Magento\Framework\TestFramework\Unit\Helper\ObjectManagerます。 Magento 2およびPHPUnit それに加えて、Magento 2にはPHPUnit 4.1.0がバンドルされており、PHP7互換ではありません。ネイティブ型(stringおよびintなど)を型ヒントし、署名で戻り値の型を宣言すると、エラーがスローされます。たとえば、次のようなメソッドシグネチャを持つインターフェイス/クラス: public function foo(string $bar) : bool; ... PHPUnit 4.1.0でモックすることはできません。:-( 私の現在の状況 このため、私はほとんどの場合、3番目の方法(システムグローバルなPHPUnitバージョンを呼び出すこと)で単体テストを書いています。 私の設定では、PHPUnit 5.6がグローバルにインストールされているため、適切なPHP7コードを記述して解決できますが、いくつかの調整が必要です。例えば: phpunit.xml コンポーザーオートローダーを使用できるように、次のようにする必要があります。 <?xml version="1.0"?> <phpunit bootstrap="../../../../../../vendor/autoload.php" colors="true"> <testsuites> <testsuite name="Testsuite"> <directory>.</directory> </testsuite> </testsuites> </phpunit> ...そして、私のすべての- setUp()メソッドでは、次のチェックを行っているので、前方互換性でテストを書くことができます: // Only allow PHPUnit 5.x: if …

3
致命的なエラー:Magento 2でインターフェイスをインスタンス化できませんか?
Magento 2でプログラムでバンドル製品を作成する一環として、以下のエラーが発生しています。私もvar / cacheとgenerationを削除しました。 これは重複した質問である可能性がありますが、この問題ではどの回答も機能していません。 致命的なエラー:73行目で\ ObjectManager \ Factory \ Dynamic \ Developer.phpのインターフェイスMagento \ Catalog \ Api \ Data \ ProductExtensionInterfaceをインスタンス化できません リンクの参照として以下のコードを使用 $productExtension = $objectManager->create(\Magento\Catalog\Api\Data\ProductExtensionInterface::class); $option = $objectManager->create(\Magento\Bundle\Api\Data\OptionInterface::class); $option->setTitle('Size'); $option->setType('radio'); $option->setRequired(true); $option->setPosition(1); //$option->setProductLinks($links); $productExtension->setBundleOptions([$option]); $_product->setExtensionAttributes($productExtension); 私は一時的/迅速な目的でオブジェクトマネージャーを使用しています。オブジェクトマネージャーをコンストラクター差止命令に変換します。 誰でもこの問題に関して私を助けることができます。

5
Magento2:テンプレートファイルでメディアURLを取得(オブジェクトマネージャーを直接呼び出すことなく)
Media URLテンプレートファイルの取得方法 私が見つけた解決策はすべて、Object Managerを直接呼び出すことです。もう1つの懸念は、ベストプラクティスとしてオブジェクトマネージャーを直接呼び出すことはできますか?(ほとんどのソリューションでオブジェクトマネージャーを使用しているため)

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 …

3
Magento2:別のフィールドによるモデルデータの読み込み
「メッセージ」という名前のテーブルを以下に示します。 id | posts_id | message_description | created_at ----------------------------------------------------------------------------- 1 1 test1 2016-09-06 10:00:00 2 1 test2 2016-09-06 11:00:00 3 2 test1 2016-09-06 10:00:00 4 2 test2 2016-09-06 11:00:00 app \ code \ Custom \ Module \ Block \ Edit.php $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $messages = $objectManager->create('Custom\Module\Model\Messages')->loadByPostsId($this->getRequest()->getParam('id')); return $messages; posts_idでメッセージを取得したいと思います。どうすれば入手できますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.