如何在magento的Observer中获取控制器方法?

时间:2014-10-01 11:30:26

标签: magento

我需要Observer中的控制器方法

我的观察员:

public function observer()
{
//need controller action here
}

我的控制器:

public function adminAction()
    {
    //my action
    }

我的问题

  1. 是否可以在magento的观察者中调用控制器方法。
  2. 如果是,请解释如何? 如果没有那么有没有办法通过观察者点击控制器动作?

1 个答案:

答案 0 :(得分:4)

您可以使用

在任何地方实例化控制器
$controller = Mage::getControllerInstance(
    'The_Controller_Class',
    Mage::app()->getRequest(),
    Mage::app()->getResponse());

要判断这是否是最佳方法,我需要了解更多有关您的用例的信息,但可能不是。如果您想要在不重定向的情况下显示其他页面,请查看Mage_Core_Controller_Varien_Action::_forward()

/**
 * Throw control to different action (control and module if was specified).
 *
 * @param string $action
 * @param string|null $controller
 * @param string|null $module
 * @param array|null $params
 */
protected function _forward($action, $controller = null, $module = null, array $params = null)
{
    $request = $this->getRequest();

    $request->initForward();

    if (isset($params)) {
        $request->setParams($params);
    }

    if (isset($controller)) {
        $request->setControllerName($controller);

        // Module should only be reset if controller has been specified
        if (isset($module)) {
            $request->setModuleName($module);
        }
    }

    $request->setActionName($action)
        ->setDispatched(false);
}

不幸的是,它受到保护,所以它只能在控制器中使用。但你可以从其他任何地方做同样的事情。这里发生了什么:

  1. 原始请求(可通过Mage::app()->getRequest()获得)已备份:$request->initForward()
  2. 然后使用不同的控制器操作和参数修改请求对象。
  3. 请求的“dispatched”标志设置为false。这样,在当前控制器操作完成后,前端控制器将再次使用现在更改的参数调度请求。
  4. 如果您的观察者附加到调度之前发生的事件,则更改请求参数就足够了。