Questions tagged «object-manager»

7
Magento 2:直接使用还是不使用ObjectManager?
好的,昨天我们就与Magento社区的其他人就直接使用ObjectManagerclass / templates进行了大讨论。 我已经知道了我们不应该直接使用ObjectManager的原因,并引用了Alan Kent的话: 有几个原因。该代码将起作用,但是最佳实践是不直接引用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); 而不是经历痛苦但推荐的过程: 创建一个模块 宣布偏好 注入依赖 声明一个公共方法 但是,随之而来的难题是,Magento 2核心文件经常直接调用ObjectManager。可以在此处找到一个简单的示例:https : //github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57 所以这是我的问题: Magento为什么要做他们建议我们不要做的事情?这是否意味着在某些情况下我们应该ObjectManager直接使用Direct?如果是这样,那是什么情况? 直接使用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 unit并在与Magento捆绑在一起的默认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捆绑了与PHP7不兼容的PHPUnit 4.1.0。提示类型的本机(如string和int)并在签名中声明返回类型将引发错误。例如,具有方法签名的接口/类如下: public function foo(string $bar) : bool; ...将无法被PHPUnit 4.1.0模拟。:-( 我目前的情况 因此,我现在主要以第三种方式(通过调用系统全局PHPUnit版本)编写单元测试。 在我的设置中,我全局安装了PHPUnit 5.6,因此我可以解决编写正确的PHP7代码的问题,但是我必须做一些调整。例如: phpunit.xml 必须看起来像这样,所以我可以使用composer autoloader: <?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 (version_compare(\PHPUnit_Runner_Version::id(), …

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); 我将对象管理器用于临时/快速用途,会将对象管理器转换为构造函数指令。 任何人都可以帮助我解决这个问题。


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 致命错误:无法在第162行的C:\ xampp \ htdocs \ magento \ vendor \ magento \ framework …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.