Events 如何向Shopware中的帐户控制器添加操作

Events 如何向Shopware中的帐户控制器添加操作,events,shopware,Events,Shopware,如何向Shopware中的现有控制器添加自定义操作 示例(url结构): 通常,为该目的创建一个新控制器更容易、更干净,但在某些情况下是必要的。扰流板:更换控制器 没有比更换整个控制器并扩展其功能更干净的方法了,所以它几乎和Shopware的挂钩一样干净 指南 将新订户添加到插件 class AccountSubscriber implements SubscriberInterface { /** * @return array */ public stat

如何向Shopware中的现有控制器添加自定义操作

示例(url结构):


通常,为该目的创建一个新控制器更容易、更干净,但在某些情况下是必要的。

扰流板:更换控制器

没有比更换整个控制器并扩展其功能更干净的方法了,所以它几乎和Shopware的挂钩一样干净

指南

将新订户添加到插件

class AccountSubscriber implements SubscriberInterface
{
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return array(
            'Enlight_Controller_Dispatcher_ControllerPath_Frontend_Account' => 'getAccountController'
        );
    }

    /**
     * @return string
     */
    public function getAccountController()
    {
        return $this->getPath() . '/Controllers/Frontend/AccountExtended.php';
    }

    /**
     * @return string
     */
    public function getPath()
    {
        $plugin = Shopware()->Container()->get('kernel')->getPlugins()['AcmeYourPlugin'];

        return $plugin->getPath();

    }
}
缺点

不幸的是,一些控制器有影响逻辑的私有方法。比如账户管理员。因此,不可能总是简单地扩展控制器

最后,尝试添加具有新路由的新控制器。
它更简单、更干净。

有一种比更换整个控制器更干净的方法。 由于缺乏更新兼容性,也不建议更换整个控制器。 在最坏的情况下,这样的事情可能会毁掉整个网站。 不久前,我在(德语)中创建了一个线程,讨论完全相同的问题。我想扩展签出控制器中现有的finishAction()

public function onPostDispatchCheckout(\Enlight_Controller_ActionEventArgs $args)
{
/** @var \Enlight_Controller_Action $controller */
$controller = $args->getSubject();

/** @var \Enlight_Controller_Request_Request $request */
$request = $controller->Request();

if ($request->getActionName() !== 'finish') {
    return;
}

// do your stuff here
}
因此,尽管这与你遇到的问题不完全相同,但程序是完全相同的

首先订阅控制器(在我的例子中是PostDispatchCheckout控制器),然后在Bootstrap.php中编辑控制器

为了确保,它只是改变了您使用if构造的特定操作,这样您的代码就可以在希望的操作上被触发[在我的例子中是finishAction()]

我希望这有帮助。但让我感到奇怪的是,为什么您必须向现有控制器添加一个新的操作。我想不出有什么情况比创建一个全新的自定义控制器更切实可行

亲切问候,


Max

您不应更换“帐户”控制器。 您可以使用以下命令为现有控制器定义自己的操作:

public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_Frontend_Account_MyBonus'        => 'onAccountMyBonus',        
      ];
    }
然后

public function onAccountMyBonus(\Enlight_Event_EventArgs $args)
    {
        $args->setProcessed(true);
        .....
         your code here
}

在我的具体用例中,我必须在不同的路径上实现第二个注册页面。使用与帐户控制器相同的登录功能。问题:在某些情况下,Shopware的帐户控制器会将所有请求转发给内部注册控制器(例如,错误的登录凭据)。我知道后/预调度方式可以扩展控制器功能,但在我的情况下,这是不可能的。
public function onAccountMyBonus(\Enlight_Event_EventArgs $args)
    {
        $args->setProcessed(true);
        .....
         your code here
}