文章列表


magento2中的Plugin机制--around方法详解

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p><span style="text-wrap: nowrap;">around插件围绕观察到的方法运行,使我们能够在原始方法调用前后运行一些代码。这是一个非常强大的概念,因为我们可以更改传入的参数以及函数的返回值。</span></p><p><span style="text-wrap: nowrap;">在编写around插件时,有几个关键点需要记住:</span></p><p><span style="text-wrap: nowrap;">传递给插件的第一个参数是观察到的类型实例。进入插件的第二个参数是可调用/Closure。通常,此参数的类型和名称为可调用$proceed。</span></p><p><span style="text-wrap: nowrap;">我们必须确保将与原始方法签名相同的参数转发到此可调用对象。</span></p><p><span style="text-wrap: nowrap;">所有其他参数都是原始观察到的方法的参数。插件必须返回与原始函数相同的值,理想情况下返回$proceed(…)或$returnValue=$processed();</span></p><p><span style="text-wrap: nowrap;">然后是$returnValue;对于需要修改$returnValue的情况。</span></p><p><span style="text-wrap: nowrap;">让我们来看看Magento的一个插件实现,该实现在&lt;Magento_DIR&gt;模块分组产品/etc/di.xml文件中指定:</span></p><pre class="brush:bash;toolbar:false">&lt;type&nbsp;name=&quot;Magento\Catalog\Model\ResourceModel\Product\Link&quot;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&nbsp;name=&quot;groupedProductLinkProcessor&quot;&nbsp;type=&quot;Magento\GroupedProduct\Model\ResourceModel\Product\Link\RelationPersister&quot;&nbsp;/&gt; &lt;/type&gt;</pre><p><span style="text-wrap: nowrap;">此插件的原始方法以Magento\Catalog\Model\ResourceModel\Product\Link类的deleteProductLink方法为目标:</span></p><pre class="brush:bash;toolbar:false">public&nbsp;function&nbsp;deleteProductLink($linkId)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;getConnection()&nbsp;-&nbsp;&gt;&nbsp;delete($this&nbsp;-&nbsp;&gt;&nbsp;getMainTable(),&nbsp;[&#39;link_id&nbsp;=&nbsp;?&#39;&nbsp;=&gt;&nbsp;$linkId]); }</pre><p><span style="text-wrap: nowrap;">around插件的实现是通过Magento\GroupedProduct\Model\ResourceModel\Product\Link\RelationPersister类的aroundDeleteProductLink方法提供的</span></p><p><span style="text-wrap: nowrap;">如以下部分示例所示:</span></p><pre class="brush:bash;toolbar:false">function&nbsp;aroundDeleteProductLink(\Magento\&nbsp;GroupedProduct\&nbsp;Model\&nbsp;ResourceModel\&nbsp;Product\&nbsp;Link&nbsp;$subject,&nbsp;\Closure&nbsp;$proceed,&nbsp;$linkId)&nbsp; {&nbsp;//&nbsp;The&nbsp;rest&nbsp;of&nbsp;the&nbsp;code...&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;$proceed($linkId);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;The&nbsp;rest&nbsp;of&nbsp;the&nbsp;code...&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;</pre><p></p>

magento2中的Plugin--before方法详解

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>magento2的插件机制允许我们对指定方法运行之前或者之后对该方法进行动态修改,包括对方法的参数、返回值等。</p><p>本篇文章我们为大家介绍一下magento2中的Plugin机制中的before方法。</p><p><span style="text-wrap: nowrap;">before插件,顾名思义,在观察到的方法之前运行。在编写before plugin时,有几个要点需要记住:</span></p><p><span style="text-wrap: nowrap;">before关键字被附加到observedinstance方法中。如果观察到的方法被调用getSomeValue,那么插件方法被调用beforeGetSomeValue。</span></p><p><span style="text-wrap: nowrap;">before-plugin方法的第一个参数始终是观察到的实例类型,通常缩写为$subject或直接由类类型缩写——在我们的示例中是$processor。</span></p><p><span style="text-wrap: nowrap;">为了提高可读性,我们可以对其进行类型转换。插件方法的所有其他参数必须与观察到的方法的参数匹配。</span></p><p><span style="text-wrap: nowrap;">插件方法必须返回一个数组,该数组的参数类型和数量与观察到的方法的输入参数相同。让我们来看看Magento在插件实现之前的一个,</span></p><p><span style="text-wrap: nowrap;">即&lt;Magento_DIR&gt;模块支付/etc/frontend/di.xml文件中指定的一个:</span></p><pre class="brush:bash;toolbar:false">&lt;type&nbsp;name=&quot;Magento\Checkout\Block\Checkout\LayoutProcessor&quot;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&nbsp;name=&quot;ProcessPaymentConfiguration&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=&quot;Magento\Payment\Plugin\PaymentConfigurationProcess&quot;/&gt; &lt;/type&gt;</pre><p><span style="text-wrap: nowrap;">此插件的原始目标方法是Magento\Checkout\Plock\Checkout\LayoutProcessor类的处理方法:</span></p><pre class="brush:bash;toolbar:false">public&nbsp;function&nbsp;process($jsLayout)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;The&nbsp;rest&nbsp;of&nbsp;the&nbsp;code...&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$jsLayout;}</pre><p><span style="text-wrap: nowrap;">before插件的实现是通过Magento\Payment\plugin\PaymentConfigurationProcess类的beforeProcess方法提供的,如以下部分示例所示:</span></p><pre class="brush:bash;toolbar:false">public&nbsp;function&nbsp;beforeProcess( \Magento\&nbsp;Checkout\&nbsp;Block\&nbsp;Checkout\&nbsp;LayoutProcessor&nbsp;$processor,&nbsp;$jsLayout )&nbsp;{&nbsp;//&nbsp;The&nbsp;rest&nbsp;of&nbsp;the&nbsp;code...&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[$jsLayout];}</pre><p><br/></p>

magento2中的工厂模式factory,factories详解

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p><span style="text-wrap: nowrap;">工厂是创建其他类的类,很像对象管理器,只是这次我们被鼓励直接使用它们。</span></p><p><span style="text-wrap: nowrap;">它们的目的是实例化不可注入的类——那些我们不应该直接注入到__construct中的类。</span></p><p><span style="text-wrap: nowrap;">使用工厂的美妙之处在于,大多数时候,我们甚至不必编写它们,因为它们是由Magento自动生成的,</span></p><p><span style="text-wrap: nowrap;">除非我们需要为工厂类实现某种特定的行为。</span><span style="text-wrap: nowrap;">通过在整个&lt;MAGENTO_DIR&gt;目录的*.php文件中查找Factory$字符串,</span></p><p><span style="text-wrap: nowrap;">我们可以看到数千个工厂示例,分布在MAGENTO的大多数模块中。</span><span style="text-wrap: nowrap;">虽然这些工厂中有很多是实际存在的,</span></p><p><span style="text-wrap: nowrap;">但其他工厂是在需要时自动生成的。</span><span style="text-wrap: nowrap;">让我们快速了解一个自动生成的工厂,即Magento\Newsletter\Model\SubscriberFactory,</span></p><p><span style="text-wrap: nowrap;">它用于几个Magento模块,如新闻稿、订户和评论模块:</span></p><pre class="brush:bash;toolbar:false">class&nbsp;SubscriberFactory&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$_objectManager&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;$_instanceName&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__construct(\Magento\&nbsp;Framework\&nbsp;ObjectManagerInterface&nbsp;$objectManager,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;$instanceName&nbsp;=&nbsp;&#39;\\Magento\\Newsletter\\Model\\Subscriber&#39;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_objectManager&nbsp;=&nbsp;$objectManager; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_instanceName&nbsp;=&nbsp;$instanceName; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;create(array&nbsp;$data&nbsp;=&nbsp;array())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_objectManager&nbsp;-&nbsp;&gt;&nbsp;create($this&nbsp;-&nbsp;&gt;&nbsp;_instanceName,&nbsp;$data); &nbsp;&nbsp;&nbsp;&nbsp;} }</pre><p><span style="text-wrap: nowrap;">自动生成的工厂代码本质上只是对象管理器创建方法之上的一个薄包装。</span></p><p><span style="text-wrap: nowrap;">工厂与di.xml首选项机制配合良好,这意味着我们可以很容易地将接口传递到构造函数中,如下所示:</span></p><pre class="brush:bash;toolbar:false">public&nbsp;function&nbsp;__construct(\Magento\&nbsp;CatalogInventory\&nbsp;Api\&nbsp;StockItemRepositoryInterface&nbsp;$stockItemRepository,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\Magento\&nbsp;CatalogInventory\&nbsp;Api\&nbsp;StockItemCriteriaInterfaceFactory&nbsp;$stockItemCriteriaFactory)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;stockItemRepository&nbsp;=&nbsp;$stockItemRepository; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;stockItemCriteriaFactory&nbsp;=&nbsp;$stockItemCriteriaFactory; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;//&nbsp;$criteria&nbsp;=&nbsp;$this-&gt;stockItemCriteriaFactory-&gt;create();//&nbsp;$result&nbsp;=&nbsp;$this-&gt;stockItemRepository-&gt;getList($criteria);</pre><p><span style="text-wrap: nowrap;">首选项机制确保在调用对象实例的构造函数时将具体实现传递给对象实例。</span></p><p><span style="text-wrap: nowrap;">在开发人员模式下,Magento执行自动编译,这意味着对di.xml的更改将自动获取。</span></p><p><span style="text-wrap: nowrap;">然而,有时,如果我们偶然发现意外的结果,运行bin/magento setup:di:compile控制台命令,</span></p><p><span style="text-wrap: nowrap;">甚至手动清除生成的文件夹(rm-rf-generated/*)可能有助于解决问题。</span></p><p><br/><span style="text-wrap: nowrap;"></span></p>

magento2中的Proxy代理模式详解

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>magento2中的proxy是一种设计模式,比较难于理解,本篇内容将为大家介绍magento2中的代理模式:proxy<br/></p><p><span style="text-wrap: nowrap;">当对象创建成本很高,并且类的构造函数占用了大量资源时,就会使用代理类。为了避免不必要的性能影响,</span></p><p><span style="text-wrap: nowrap;">Magento使用Proxy类将给定的类型变成它们的延迟加载版本。</span></p><p><span style="text-wrap: nowrap;">在所有Magento di.xml文件中快速查找\Proxy&lt;/argument&gt;字符串可以发现该字符串出现了一百多次。</span></p><p><span style="text-wrap: nowrap;">可以说,Magento在其代码中广泛使用代理。</span></p><p><span style="text-wrap: nowrap;">&lt;MAGENTO_DIR&gt;/module-customer/etc/di.xml下的类型定义是使用代理的一个很好的例子:</span></p><pre class="brush:bash;toolbar:false">&lt;type&nbsp;name=&quot;Magento\Customer\Model\Session&quot;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;arguments&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name=&quot;configShare&quot;&nbsp;xsi:type=&quot;object&quot;&gt;Magento\Customer\Model\Config\Share\Proxy&lt;/argument&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name=&quot;customerUrl&quot;&nbsp;xsi:type=&quot;object&quot;&gt;Magento\Customer\Model\Url\Proxy&lt;/argument&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name=&quot;customerResource&quot;&nbsp;xsi:type=&quot;object&quot;&gt;Magento\Customer\Model\ResourceModel\Customer\Proxy&lt;/argument&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name=&quot;storage&quot;&nbsp;xsi:type=&quot;object&quot;&gt;Magento\Customer\Model\Session\Storage&lt;/argument&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name=&quot;customerRepository&quot;&nbsp;xsi:type=&quot;object&quot;&gt;Magento\Customer\Api\CustomerRepositoryInterface\Proxy&lt;/argument&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;/arguments&gt; &lt;/type&gt;</pre><p><span style="text-wrap: nowrap;">如果我们查看Magento\Customer\Model\Session类型的构造函数,我们可以看到四个参数</span></p><p><span style="text-wrap: nowrap;">(configShare、customerUrl、customerResource和customerRepository)中,</span></p><p><span style="text-wrap: nowrap;">没有一个在PHP文件中声明为Proxy。</span><span style="text-wrap: nowrap;">它们是通过di.xml重写的。</span></p><p><span style="text-wrap: nowrap;">这些代理类型还不真正存在,因为Magento依赖注入(di)编译过程创建了它们。</span></p><p><span style="text-wrap: nowrap;">它们是在生成的目录下自动生成的。</span></p><p><span style="text-wrap: nowrap;">编译后,可以在生成的/code/Magento/Customer/Model/Url/Proxy.php</span></p><p><span style="text-wrap: nowrap;">文件下轻松找到Magento\Customer\Model\Url\Proxy.php类型。</span></p><p><span style="text-wrap: nowrap;">让我们局部来看一下:</span></p><pre class="brush:bash;toolbar:false">&lt;?php class&nbsp;Proxy&nbsp;extends\&nbsp;Magento\&nbsp;Customer\&nbsp;Model\&nbsp;Url&nbsp;implements\&nbsp;Magento\&nbsp;Framework\&nbsp;ObjectManager\&nbsp;NoninterceptableInterface&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__construct(\Magento\&nbsp;Framework\&nbsp;ObjectManagerInterface&nbsp;$objectManager,&nbsp;$instanceName&nbsp;=&nbsp;&#39;\\Magento\\Customer\\Model\\Url&#39;,&nbsp;$shared&nbsp;=&nbsp;true)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_objectManager&nbsp;=&nbsp;$objectManager; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_instanceName&nbsp;=&nbsp;$instanceName; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_isShared&nbsp;=&nbsp;$shared; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__sleep()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[&#39;_subject&#39;,&nbsp;&#39;_isShared&#39;,&nbsp;&#39;_instanceName&#39;]; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__wakeup()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_objectManager&nbsp;=&nbsp;\Magento\&nbsp;Framework\&nbsp;App\&nbsp;ObjectManager::getInstance(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__clone()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_subject&nbsp;=&nbsp;clone&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_getSubject(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;function&nbsp;_getSubject()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$this&nbsp;-&nbsp;&gt;&nbsp;_subject)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_subject&nbsp;=&nbsp;true&nbsp;===&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_isShared&nbsp;?&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_objectManager&nbsp;-&nbsp;&gt;&nbsp;get($this&nbsp;-&nbsp;&gt;&nbsp;_instanceName)&nbsp;:&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_objectManager&nbsp;-&nbsp;&gt;&nbsp;create($this&nbsp;-&nbsp;&gt;&nbsp;_instanceName); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_subject; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;getLoginUrl()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_getSubject()&nbsp;-&nbsp;&gt;&nbsp;getLoginUrl(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;getLoginUrlParams()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_getSubject()&nbsp;-&nbsp;&gt;&nbsp;getLoginUrlParams(); &nbsp;&nbsp;&nbsp;&nbsp;} }</pre><p><span style="text-wrap: nowrap;">Proxy类的组成显示了它包装原始Magento\Customer\Model\Url类型的机制。这意味着,在整个Magento中,</span></p><p><span style="text-wrap: nowrap;">每次请求Magento\Customer\Model\Url类型时,</span></p><p><span style="text-wrap: nowrap;">Magento\Customer\Module\Url\Proxy都会被传递。与原始类型的__construct方法(可能会影响性能)不同,</span></p><p><span style="text-wrap: nowrap;">自动生成代理的__construction方法是轻量级的。</span><span style="text-wrap: nowrap;">这消除了可能的性能瓶颈。_getSubject方法用于在调用任何原始类型的公共方法时,</span></p><p><span style="text-wrap: nowrap;">实例化/延迟加载原始类型。</span></p><p><span style="text-wrap: nowrap;">例如,对getLoginUrl方法的调用将通过代理。</span></p><p><span style="text-wrap: nowrap;">Magento生成的每个代理都实现了Magento\Framework\ObjectManager\NoninterceptableInterface。</span></p><p><span style="text-wrap: nowrap;">尽管接口本身是空的,但它被用作标识代理的标记,</span></p><p><span style="text-wrap: nowrap;">我们不需要为其生成拦截器(插件)。</span></p><pre class="brush:bash;toolbar:false">class&nbsp;Customer&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public &nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;__construct(\Magento\&nbsp;Customer\&nbsp;Model\&nbsp;Url\&nbsp;Proxy&nbsp;$customerUrl)&nbsp;{&nbsp;//...&nbsp;&nbsp;&nbsp;&nbsp;}}</pre><p><span style="text-wrap: nowrap;"></span></p><p><span style="text-wrap: nowrap;">然而,这种做法是一种糟糕的做法。正确执行此操作的方法是使用原始Magento\Customer\Model\Url类型指定__construct,</span></p><p><span style="text-wrap: nowrap;">然后按如下方式添加di.xml:</span></p><pre class="brush:bash;toolbar:false">&lt;type&nbsp;name=&quot;Magelicious\Core\Model\Customer&quot;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;arguments&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name=&quot;customerUrl&quot;&nbsp;xsi:type=&quot;object&quot;&gt;Magento\Customer\Model\Url\Proxy&lt;/argument&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;/arguments&gt; &lt;/type&gt;</pre><p><span style="text-wrap: nowrap;"></span></p><p><span style="text-wrap: nowrap;"></span></p>

magento2中使用ZendFramework

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>根据Zend Framework案例研究,可在https://www.zend.com/topics/Magento-CS.pdf</p><p>Magento项目选择使用行业标准的PHP和Zend框架,因为它具有极其简单、面向对象和灵活的解决方案</p><p>封装了最佳实践和敏捷测试方法,并将导致企业级web应用程序的快速开发。</p><p>使用Zend框架作为Magento项目的主要支柱,肯定包括以下优势:</p><p>世界各地的Magento贡献者都知道Zend框架。</p><p>有很好的web服务支持将Magento与不同的软件解决方案集成以共享数据。</p><p>MVC设计模式有助于组织项目开发。</p><p>有了Zend框架,Magento在创建和定制模块、为系统开发新功能方面具有很大的灵活性,以及维护核心代码。</p><p>对于开发人员来说,对Zend组件的基本理解可能会很有趣,可以利用这个伟大的MVC框架</p><p>&nbsp;</p><p>&nbsp;<br/></p><p><br/></p>

magento2应用新建的主题

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>正如您在上一章中所学到的,是时候激活新主题了。</p><p>在“管理”区域激活CompStore Electronics主题(http://localhost/magento/admin)&nbsp; 以查看以下结果</p><p><img src="/uploads/images/20230719/b8fb9c657db816dd23de8b7bb57dd956.png" title="3.png" alt=""/></p><p>有时,当您更新Magento结构或激活新主题时,您需要部署主题和模块更改。</p><p>如果要部署更改,请执行以下步骤:打开终端或命令提示符。</p><p>删除packt/pub/static/frontend/&lt;Vendor&gt;/&lt;theme&gt;/&lt;locale&gt;目录。</p><p>删除var/cachedirectory。</p><p>删除var/view_preprocesseddirectory。</p><p>然后,访问packt/binddirectory。</p><p>运行php magento setup:static content:deploy在某些情况下,有必要再次授予目录写权限。</p><p>&nbsp;</p><p>&nbsp;</p><p><br/></p>

magento2应用css到新建的主题

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>一旦你必须在CompStore中进行更改才能自定义新主题,你可以考虑其他主题中已经可用的功能来应用你的更改。</p><p>Magento 2.0根目录下的vendor目录处理所有本地Magento模块和主题。</p><p>到目前为止,您一直在研究的Magento blank和Luma主题分别</p><p>为invendor/Magento/theme front-end blank</p><p>和vendor/Magento/theme Front-end Luma。</p><p>因此,CompStore主题“接收”了这些文件夹下主题的所有功能。</p><p>修复这些基本概念以理解您在开发Magento主题解决方案时插入的上下文是很重要的。</p><p>一旦您对行为有了明确的概念,让我们为CompStore主题创建一个自定义.css文件:</p><p>将Packt/vendor/magento/theme-front-end-black/web/css/styles.less</p><p>file复制到Packt/app/design/fron-end/Packt/CompStore/web/cslocation</p><p>打开复制的文件并插入animport命令,如下例所示:</p><pre class="brush:bash;toolbar:false">@import&nbsp;&#39;source/lib/_lib.less&#39;; @import&nbsp;&#39;source/_sources.less&#39;; @import&nbsp;&#39;source/_components.less&#39;; @import&nbsp;&#39;source/compstore.less&#39;;</pre><p>&nbsp;</p><p>保存文件。</p><p>现在,打开您喜欢的代码编辑器,在packt/app/design/frontend/compstore/web/css/source目录下创建compstore.less文件,</p><p>然后键入以下代码:</p><pre class="brush:bash;toolbar:false">@color-compstore:&nbsp;#F6F6F6; body{ background:&nbsp;@color-compstore; }</pre><p>使用override,让我们通过在packt/app/design/frontend/compstore/web/css/source下创建_theme.less文件来更改产品页面的颜色模式</p><p>执行以下操作:</p><pre class="brush:bash;toolbar:false">//Change&nbsp;color&nbsp;of&nbsp;elements&nbsp;in&nbsp;Product&nbsp;Page @color-catalog:&nbsp;#4A96AD; @page__background-color:&nbsp;@color-catalog; @sidebar__background-color:&nbsp;@color-gray40; @primary__color:&nbsp;@color-gray80; @border-color__base:&nbsp;@color-gray76; @link__color:&nbsp;@color-gray56; @link__hover__color:&nbsp;@color-gray60; @button__color:&nbsp;@color-gray20; @button__background:&nbsp;@color-gray80; @button__border:&nbsp;1px&nbsp;solid&nbsp;@border-color__base; @button-primary__background:&nbsp;@color-orange-red1; @button-primary__border:&nbsp;1px&nbsp;solid&nbsp;@color-orange-red2; @button-primary__color:&nbsp;@color-white; @button-primary__hover__background:&nbsp;darken(@color-orange-red1,&nbsp;5%); @button-primary__hover__border:&nbsp;1px&nbsp;solid&nbsp;@color-orange-red2; @button-primary__hover__color:&nbsp;@color-white; @navigation-level0-item__color:&nbsp;@color-gray80; @submenu-item__color:&nbsp;@color-gray80; @navigation__background:&nbsp;@color-gray40; @navigation-desktop-level0-item__color:&nbsp;@color-gray80; @navigation-desktop-level0-item__hover__color:&nbsp;@color-gray34; @navigation-desktop-level0-item__active__color:&nbsp;@navigation-desktop-level0-item__color; @tab-control__background-color:&nbsp;@page__background-color; @form-element-input__background:&nbsp;@color-gray89; @form-element-input-placeholder__color:&nbsp;@color-gray60; @header-icons-color:&nbsp;@color-gray89; @header-icons-color-hover:&nbsp;@color-gray60;</pre><p>&nbsp;</p><p>&nbsp;</p><p><br/></p>

magento2使用LESS处理CSS

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在CompStore Magento主题中应用CSS之前,研究Magento系统中的CSS行为是很重要的。</p><p>Magento 2.0中的样式表使用LESS技术进行预处理并编译为CSS。</p><p><a href="http://lesscss.org">http://lesscss.org</a></p><p>是一个CSS预处理器,它通过包含变量和函数来扩展CSS的传统功能,以生成强大的CSS代码,并节省维护代码的时间。</p><p>您将保存在主题中的所有.LESS文件都是由LESS引擎编译的,但您将始终在Magento主题前端解密.css。以下是几个例子:</p><p>前端声明:&lt;css src=“css/styles.css”/&gt;</p><p>根源文件:&lt;Magento_theme_dir&gt;/web/css/styles.less</p><p><br/></p><p>&nbsp;</p><p>&nbsp;</p><p><br/></p>

magento2中使用自定义变量

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>自定义变量是包含特定值作为编程变量的HTML代码。</p><p>通过创建自定义变量,您可以将其应用于网站上的多个区域。</p><p>此处显示了自定义变量结构的示例:</p><pre class="brush:bash;toolbar:false">{{config&nbsp;path=&quot;web/unsecure/base_url&quot;}}</pre><p>这个变量显示了商店的URL。</p><p>现在,让我们创建一个自定义变量来看看它是如何工作的。执行以下步骤:</p><p>导航到“系统|自定义变量”,然后单击“添加新变量”按钮。</p><p><br/></p><p>在“变量代码”字段中,输入小写且不带空格的变量,例如dev_name.输入变量名称,说明变量的用途。</p><p>在“变量HTML值”和“变量纯文本值”字段中输入自定义变量的HTML和纯文本值,然后保存。</p><p>现在,我们有一个自定义变量来存储开发人员的名称。</p><p>让我们通过以下步骤在CMS“关于我们”</p><p>页面中使用此变量:在“管理”区域中,导航到“内容|页面”。</p><p>单击以编辑“关于我们》项目。</p><p>然后,单击“内容”侧菜单。</p><p>单击“显示/隐藏编辑器”按钮以隐藏HTML编辑器。将以下代码放在内容末尾:</p><pre class="brush:bash;toolbar:false">{{CustomVar&nbsp;code=&quot;dev_name&quot;}}</pre><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;<br/></p><p><br/></p>

magento2的cms中的block

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>Magento有一个灵活的主题系统。</p><p>除了Magento代码自定义之外,管理员还可以在Magento管理面板上创建块和内容,如主页、关于我们或您想要创建的任何静态页面。</p><p>Magento上的CMS页面和块使您能够在页面中嵌入HTML代码。</p><p>您可以通过访问“管理”区域来创建或编辑页面和块(http://localhost/magento/admin )通过导航到内容|页面。</p><p><img src="/uploads/images/20230719/d79d54c47c2d6f2909348aec153fc74f.png" title="5.png" alt=""/></p><p><br/></p><p>&nbsp;</p><p><br/></p>