我想覆盖现有Magento/*模块的Controller行为。我想创建自己的Magento/Customer/Controller/Account/LoginPost.php-实现。

  • 我该怎么做?
  • 依赖注入对于模型类来说似乎是件好事,但控制器又如何呢?我可以在某个地方注入我自己的LoginPost控制器类,以便某些对象使用我自己的实现吗?
  • 最佳答案

    您可以为此使用Magento2's Plugins功能。

    Magento使您能够更改或扩展任何行为
    任何Magento类中的原始公共方法。您可以更改
    创建扩展的原始方法的行为。这些
    扩展使用Plugin类,因此称为
    插件。

    将以下内容写入模块的app/code/YourNamespace/YourModule/etc/di.xml文件中:

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
       <type name="Magento\Customer\Controller\Account\LoginPost">
           <plugin name="yourModuleAccountLoginPost" type="YourNamespace\YourModule\Plugin\Customer\LoginPost" sortOrder="10" disabled="false"/>
       </type>
    </config>
    

    创建一个名为app/code/YourNamespace/YourModule/Plugin/Customer/LoginPost.php的新文件,并在其中写入以下代码:

    <?php
    
        namespace YourNamespace\YourModule\Plugin\Customer;
    
        class LoginPost
        {
            public function aroundExecute(\Magento\Customer\Controller\Account\LoginPost $subject, \Closure $proceed)
            {
                // your custom code before the original execute function
                $this->doSomethingBeforeExecute();
    
                // call the original execute function
                $returnValue = $proceed();
    
                // your custom code after the original execute function
                if ($returnValue) {
                    $this->doSomethingAfterExecute();
                }
    
                return $returnValue;
            }
        }
    ?>
    

    同样,您也可以在上述类中使用beforeExecute()afterExecute()函数。请查看this link了解详细信息。

    关于magento2 - 如何在Magento2中覆盖Controller?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29654718/

    10-10 18:57