在zend framework3中调用其他控制器的成员函数?
答案 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;
}
}