Symfony 2 : Come eseguire il rendering di un modello al di fuori di un controller o un servizio?

Come eseguire il rendering di un modello al di fuori di un controller o un servizio?

Ho seguito la documentazione di Symfony2. Doc

namespace Acme\HelloBundle\Newsletter;

use Symfony\Component\Templating\EngineInterface;

class NewsletterManager
{
    protected $mailer;

    protected $templating;

    public function __construct(
        \Swift_Mailer $mailer,
        EngineInterface $templating
    ) {
        $this->mailer = $mailer;
        $this->templating = $templating;
    }

    //...
}

Questo è dove io chiamo in mio aiuto :

$transport = \Swift_MailTransport::newInstance();
$mailer = \Swift_Mailer::newInstance($transport);
$helper = new MailHelper($mailer);
$helper->sendEmail($from, $to, $subject, $path_to_twig, $arr_to_twig);

Quindi la prima cosa che qui manca è il secondo parametro del metodo di costruire in :

$helper = new MailHelper($mailer);

Ma come faccio a creare un’istanza del EngineInterface?

Naturalmente, non può essere :

new EngineInterface();

Mi sono completamente perso.

Tutto quello che devo fare è eseguire il rendering di un modello per l’e-mail che è stato spedito.

Ti ricordi il mio gist dal tuo googlephone domanda? È tutto lì: gist.github.com/webdevilopers/4eea317ade72a119a72e

OriginaleL’autore Brieuc | 2015-02-23

1 risposta

  1. 18

    Iniettare solo @twig e passare il template per il mailer corpo:

    <?php
    
    namespace Acme\Bundle\ContractBundle\Event;
    
    use Acme\Bundle\ContractBundle\Event\ContractEvent;
    
    class ContractListener
    {
        protected $twig;
        protected $mailer;
    
        public function __construct(\Twig_Environment $twig, \Swift_Mailer $mailer)
        {
            $this->twig = $twig;
            $this->mailer = $mailer;
        }
    
        public function onContractCreated(ContractEvent $event)
        {
            $contract = $event->getContract();
    
            $body = $this->renderTemplate($contract);
    
            $projectManager = $contract->getProjectManager();
    
            $message = \Swift_Message::newInstance()
                ->setSubject('Contract ' . $contract->getId() . ' created')
                ->setFrom('[email protected]')
                ->setTo('[email protected]')
                ->setBody($body)
            ;
            $this->mailer->send($message);
        }
    
        public function renderTemplate($contract)
        {
            return $this->twig->render(
                'AcmeContractBundle:Contract:mailer.html.twig',
                array(
                    'contract' => $contract
                )
            );
        }
    }
    Ok fammi provare di nuovo. Ho provato con Twig_Environment ma ho qualche problema a ripristinare il loader. ho intenzione di provare di nuovo e tornare a voi.
    Suppongo perché sto cercando di utilizzare questo come un servizio e non un listener di eventi, quindi devo chiamare il servizio che modo (se uso \Twig_Environment). $helper = new MailHelper($mailer, nuovo \Twig_Environment); restituisce : È necessario impostare un caricatore di prima. È davvero necessario?
    Penso che hai frainteso il modo in cui un servizio viene caricato. Controllare il symfony docs. Dare al vostro servizio un nome, chiamarlo ad esempio tramite container. Che modo mailer e ramoscello saranno inseriti automaticamente al Servizio del costruttore.
    Va bene è il modo più chiaro!!! Grazie mille per il vostro tempo. Io davvero non chiamare il servizio nel modo giusto. $this->getConfigurationPool()->getContainer()->get(‘mail_helper’); era il modo giusto.

    OriginaleL’autore webDEVILopers

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *