在zend框架3中调用其他控制器的成员函数来发送电子邮件?

时间:2017-09-11 10:26:17

标签: zend-framework3

  

在zend framework3中调用其他控制器的成员函数?

2 个答案:

答案 0 :(得分:0)

您应该编写一个邮件程序类并将其注入操作并在其上发送邮件。可能你会在很少的动作中需要邮件程序类,所以一个知道的特性会很好,所以你不必在__construct方法的每个动作上注入它。我认为类似的东西可以解决问题,因此您可以在任何您想要的地方使用您的邮件服务。别忘了注射它。

interface MailServiceInterface
{
    public function send(string $to, string $from, string $subject, string $body, array $headers = []);
}

trait MailServiceAwareTrait
{
    /**
     * @var \Infrastructure\Mailer\MailServiceInterface
     */
    protected $mailService;

    public function setMailService(MailServiceInterface $mailService)
    {
        $this->mailService = $mailService;
    }

    public function getMailService(): MailServiceInterface
    {
        return $this->mailService;
    }
}

class myAction extends AbstractActionControl
{
    use MailServiceAwareTrait;

    public function processAction()
    {
        $this->getMailService()->send($to, $from, $subject, $body);
    }
}

答案 1 :(得分:0)

“发送电子邮件”是一项服务,因此通常它应该位于单独的模型文件(即服务文件)中,而不是在控制器中。虽然你实际上可以把它作为一个函数放在一个控制器中,但这只是意味着你完全滥用MVC概念本身。

无论如何,我会回答怎么做但我强烈建议不要。在您的控制器(例如,IndexController)中,您可以这样做:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController {
    public function indexAction() {
        // This below line will call FooController's barAction()
        $otherViewModel = $this->forward()->dispatch(\Application\Controller\FooController::class, ['action'=>'bar']);
        $otherViewModel->setTemplate('application/foo/bar');// you must set which template does this view use
        return $otherViewModel;
    }
}