在Zend中调用另一个控制器操作并保持当前操作

时间:2015-11-14 20:57:38

标签: php zend-framework

我想调用另一个控制器动作,但保持现状。我只想在其他操作中运行代码。

具体来说:我有一个控制器动作来发送电子邮件。

links = [[url + day for day in to_append] for url in base_urls]
links_flattened = sum(links, [])

上述行动应该由以下行动调用:

class StreitController extends Zend_Controller_Action {

    // Fill and send mail
    public function emailAction() {

        $this->_helper->layout->disableLayout();

        // ... do something ...

        // Capture output and send mail
        $htmlString = $this->view->render('task/email.phtml');
        $this->sendMail($this->view->task['TASK_NAME'], $htmlString, $this->view->task['TASK_EMAIL']);
    }
}

runAction修改了一些数据。之后,应调用电子邮件操作以填充电子邮件模板(.phtml文件)并将其发送给接收方。但这应该是透明的。所以我不想离开调用runAction。这有可能吗?

1 个答案:

答案 0 :(得分:1)

看起来您可以使用forward()方法,只要它是您希望在该操作中执行的 last

$this->forward('email', 'task');

但我会反对它。

每当你有一段由多个消费者拥有多个代码的代码时,我认为最好将该代码重构为自己的类/方法,然后让消费者实例化/调用。

例如,您可以将“发送电子邮件”代码放入action-helper。这提供了一种用于调用功能的延迟加载按需机制。

在您的具体情况下,在多个操作中使用“发送电子邮件”代码的快捷方式是将其提升为BaseController上的方法并同时具有TaskControllerStreitController延长BaseController

请注意,通常情况下,操作助手比基本控制器更理想,因为使用基本控制器将需要所有加载代码,即使它用过。