FOSUserBundle:访问自定义电子邮件中的会话var

时间:2012-04-02 16:54:47

标签: php symfony fosuserbundle

我正在自定义用户注册后发送的确认电子邮件。 我的问题是我无法访问电子邮件模板中的会话变量。

这是我的代码(类似于FOSU​​ser文档):

{# src/Acme/DemoBundle/Resources/views/User/confirmation.email.twig #}

{% block subject %}Confirmation{% endblock %}

{% block body_text %}
{% autoescape false %}
Hello {{ user.username }} !

Your locale is : {{ app.session.locale }}

Click on the following link to confirm your registration : {{ confirmationUrl }}

Greetings,
the Acme team
{% endautoescape %}
{% endblock %}

{% block body_html %}
{% include 'AcmeDemoBundle:User:confirmation_email.html.twig' %}
{% endblock %}

以下行返回异常:

Your locale is : {{ app.session.locale }}

例外:

Variable "app" does not exist in ...

如何从此模板访问会话变量?

我还需要访问配置参数(来自parameters.ini)。 我的参数已经在全局Twig访问中,但无法在此模板中访问它们。

非常感谢您的帮助! 甲

2 个答案:

答案 0 :(得分:2)

TwigSwiftMailer类仅向模板公开User实体和确认网址。您必须扩展该类并修改方法。然后创建服务并设置为默认邮件程序。您可以查看here以获取服务定义。

编辑:

示例实现将是

班级。

//namespace declaration

class MySwiftMailer extends TwigSwiftMailer
{
    private $container;

    /**
     * @param Symofony\Component\DependencyInjection\ContainerInerface   $container
     */
    public function setContainer(ContainerInterface $container)
    {
        $this->container = $container;
    }


    public function sendConfirmationEmailMessage(UserInterface $user)
    {
        $template = $this->parameters['template']['confirmation'];
        $url = $this->router->generate('fos_user_registration_confirm', array('token' => $user->getConfirmationToken()), true);
        $context = array(
            'user' => $user,
            'container' => $this->container,
            'session' => $this->container->get('request')->getSession(), // expose session
            'confirmationUrl' => $url
        );

        $this->sendMessage($template, $context, $this->parameters['from_email']['confirmation'], $user->getEmail());
    }

    // implement sendResettingEmailMessage() in same way
}

服务声明。在您的包mailer.xml文件夹中创建一个名为Resources/config的类。

<?xml version="1.0" encoding="UTF-8"?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>

        <service id="fos_user.mailer.my_swift_mailer" class="FOS\UserBundle\Mailer\TwigSwiftMailer" >
            <argument type="service" id="mailer" />
            <argument type="service" id="router" />
            <argument type="service" id="twig" />
            <argument type="collection">
                <argument key="template" type="collection">
                    <argument key="confirmation">%fos_user.registration.confirmation.template%</argument>
                    <argument key="resetting">%fos_user.resetting.email.template%</argument>
                </argument>
                <argument key="from_email" type="collection">
                    <argument key="confirmation">%fos_user.registration.confirmation.from_email%</argument>
                    <argument key="resetting">%fos_user.resetting.email.from_email%</argument>
                </argument>
            </argument>

            <call method="setContainer">
                <argument type="service" id="service_container" />
            </call>

        </service>

    </services>

</container>

要包含loader.xml,您必须在load <{1}}

YourBundle/DependencyInjection/YourBundleExtension.php方法中加入以下行
$xmlLoader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$xmlLoader->load("mailer.xml");

并在app/config.yml设置了邮件程序。

# app/config/config.yml

fos_user:
    # ...
    service:
        mailer: fos_user.mailer.my_swift_mailer

现在,您可以在模板中执行{{ session.get('var') }}{{ container.getParameter('any_param') }}

答案 1 :(得分:0)

$session = $ this->get("session");

与app.session相同

所以如果你想要你可以通过RenderView()

发送$ session