如何将树枝模板渲染到服务中。这是最佳做法吗?

时间:2016-09-06 11:31:08

标签: twig symfony swiftmailer

我有以下Symfony 3控制器:

public function register(Request $request)
  {

    $username=$request->get('username');
    $password=$request->get('password');
    $email=$request->get('email');
    $captchaResponse=$request->get('g-recaptcha-response');

    $session =$request->getSession();

    $res1 = new Response();
    $response_data=array('status'=>0);

    if($session->get('captcha')===$captchaResponse)
    {
      $en = $this->container->get('user_model');

      $data=$en->register($username,$password,$email);

      $res1->headers->set('Content-Type','text/json');

      if($data['status']===false)
      {
        $response_data['data']="An Internal error Happened";
        error_log($data['data']);
      }
      else if($data['status']===-1)
      {
        $response_data['data']=$data['data'];
      }
      else
      {
        $response_data['status']=1;
        $response_data['data']="Please check your mail to confirm your registration.";

        /*Send Email*/
        $message = \Swift_Message::newInstance()
                    ->setSubject('Please confirm your registration')
                    ->setFrom('symphotest@openmailbox.org')
                    ->setTo($email)
                    ->setBody($this->renderView('emails/confirm.html.twig',array('token'=>$data['data'])))
                    ->addPart(
                                $this->renderView('emails/registration.txt.twig',array('token'=>$data['data'])),
                                'text/plain'
                             );
        $this->get('mailer')->send($message);
      }
     }
     else
     {
       $response_data['data']="You have not given a correct captcha";
     }

    $res1->setContent(json_encode($response_data));


    $session->set('captcha',uniqid());//Generate gibberish in order not to reuse the very same captcha again
    return $res1;
  }

我已经提供了以下服务:

namespace AppBundle\Models;

use Doctrine\ORM\EntityManager;
use AppBundle\Util\ModelStatus;
use AppBundle\Exceptions\InvalidArgumentException;
use \SwiftMessage;

class UserModel 
{
    /** @var EntityManager */
    private $em;

    /** @var \Swift_Mailer */
    private $mailer;

    /** @var \Twig_Environment */
    private $twig;

    /**
     * 
     * @param EntityManager $em
     * @param \Swift_Mailer $mailer
     * @param \Twig_Environment $twig
     */ 
    public function construct(EntityManager $em, \Swift_Mailer $mailer,\Twig_Environment $twig) 
    {
        $this->em=$em;
        $this->$mailer=$mailer;
    }

    /**
     * Performs the actions needed for Registration
     * 
     * @param unknown $username
     * @param unknown $password
     * @param unknown $email
     * @param \Swift_Message $registrationMessage
     * 
     * @return ModelStatus
     */
    public function register($username,$password,$email)
    {
        $modelStatus=new ModelStatus();

        try 
        {
            /** @var \AppBundle\Entity\UserRepository */
            $repository=$this->em->getRepository('AppBundle::Users');

            $token=$repository->register($username,$password,$email);

            $modelStatus->setData($token);
            $modelStatus->setStatus(ModelStatus::STATUS_SUCCESS);

            $this->mailer->send($registrationMessage);

            $message = Swift_Message::newInstance()
            ->setSubject('Please confirm your registration')
            ->setFrom('symphotest@openmailbox.org')
            ->setTo($email)
            ->setBody($this->twig->//->renderView('emails/confirm.html.twig',array('token'=>$data['data'])))
            ->addPart(
                    $this->renderView('emails/registration.txt.twig',array('token'=>$data['data'])),
                    'text/plain'
                    );
            $this->get('mailer')->send($message);
        }
        catch(InvalidArgumentException $arg)
        {
            $modelStatus->setStatus(ModelStatus::STATUS_FAILURE);
            $modelStatus->setMessage($arg->getMessage());   
        }
        catch (\Exception $e)
        {
            $modelStatus->setStatus(ModelStatus::STATUS_FAILURE);
            $modelStatus->setMessage($e->getMessage());
        }

        return $modelStatus;
    }
}

我正在重构以下部分:

$message = \Swift_Message::newInstance()
                        ->setSubject('Please confirm your registration')
                        ->setFrom('symphotest@openmailbox.org')
                        ->setTo($email)
                        ->setBody($this->renderView('emails/confirm.html.twig',array('token'=>$data['data'])))
                        ->addPart(
                                    $this->renderView('emails/registration.txt.twig',array('token'=>$data['data'])),
                                    'text/plain'
                                 );
            $this->get('mailer')->send($message);

进入Model方法寄存器。

但是你可以看到我渲染了一些树枝模板,我知道如何做到这一点的最佳选择。到目前为止,我认为有以下几种选择:

  • 要将模板呈现为字符串并将其传递给注册方法,请在那里创建并发送电子邮件。
  • 将树枝渲染服务加载到模型中,并将渲染加载到模型中。如果不存在则创建一个。

在第二个项目符号中,我可能需要将Twig渲染引擎加载到服务中。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

最后有这样的构造函数:

public function __construct(EntityManager $em, \Swift_Mailer $mailer,\Twig_Environment $twig)
{
    $this->em=$em;
    $this->mailer=$mailer;
    $this->twig=$twig;
}

加载这样的服务:

   user_model:
      class: AppBundle\Models\UserModel
      arguments: ['@doctrine.orm.entity_manager','@mailer','@twig']

似乎解决了这个问题。