渲染邮件模板zend框架2

时间:2014-05-29 19:36:50

标签: zend-framework2

我试图在Zend framework 2应用程序中发送带有模板的电子邮件。 这是我班级中的代码,名为" EmailService ..."。

        $view = new PhpRenderer();
    $resolver = new TemplateMapResolver();
    $resolver->setMap(array(
        'mailTemplate' => __DIR__ . '/../../../mail/' . $template['name'] . '.phtml'
    ));
    $view->setResolver($resolver);
    $viewModel = new ViewModel();
    $viewModel->setTemplate('mailTemplate')
            ->setVariables(
                    (!empty($template['variables']) && is_array($template['variables'])) ? $template['variables'] : array()
    );

    $this->_message->addFrom($this->_emailConfig['sender']['address'], $this->_emailConfig['sender']['name'])
            ->addTo($user['email'], $user['login'])
            ->setSubject($subject)
            ->setBody($view->render($viewModel))
            ->setEncoding('UTF-8');

一切正常但是在这个模板文件中我必须创建一个动作的链接(我已经为此指定了路线)。但这是一个问题。当我试图使用

<?php echo $this->url('auth') ; ?>

我得到了#34;没有提供RouteStackInterface实例&#34;错误。

如果我使用:

<?php echo $this->serverUrl(true); ?>

一切正常......有任何线索吗?

2 个答案:

答案 0 :(得分:1)

您不需要创建PhpRenderer的新实例;你可以重用已经创建的那个。

$renderer = $this->serviceManager->get('viewrenderer');

$variables = is_array($template['variables']) ? $template['variables'] : array();
$viewModel = new ViewModel($variables);
$viewModel->setTemplate('mailTemplate');

$html = $renderer->render($viewModel);

为了遵循良好的DI练习,请将PhpRenderer注入电子邮件服务的__construct(而不是服务管理器)。

此外,模板路径可以添加到普通module.config.php

return array(
    'view_manager' => array(
        'template_map' => array(
            'mailTemplate' => __DIR__ . '/../view/foo/bar.phtml',
        ),
    ),
);

答案 1 :(得分:0)

发送HTML邮件时,有很多模块可以让事情变得简单。您可以搜索here

我个人最喜欢的是MtMail。您可以轻松使用模板和布局。您可以轻松设置默认标题(From,Reply-To等)。您可以使用此Template Manager功能以面向对象的方式更好地组织电子邮件模板。

MtMail用法:

$mailService = $this->getServiceLocator()->get('MtMail\Service\Mail');

$headers = array(
    'to' => 'johndoe@domain.com',
    'from' => 'contact@mywebsite.com',
);
$variables = array(
    'userName' => 'John Doe',
);
$message = $mailService->compose($headers, 'application/mail/welcome.phtml', $variables);

$mailService->send($message);