2017-04-15 1 views
0

J'essaye de créer un message SwiftMailer en utilisant Symfony 2.8 et le SwiftMailer Bundle 2.5, où j'envoie un PDF avec un simple message HTML à une adresse. Je peux envoyer des emails, cependant tout le code d'exemple utilise des méthodes telles que addPart() et attach() qui n'existent pas dans la liste des méthodes donnée par Swift_Message et je ne trouve aucun exemple qui utilise autre chose.PHP Symfony 2.8 Swiftmailer bundle 2.5, créer un message avec pièce jointe PDF à partir du code

créer un PDF à partir d'un modèle Twig rendu, puis créer un message pour l'attacher à

$pdf = $this->get('knp_snappy.pdf')->getOutputFromHtml($response); 

$message = \Swift_Message::newInstance() 
       ->setSubject('Hello Email') 
       ->setFrom('[email protected]') 
       ->setTo('[email protected]') 
       ->setBody(
        $this->renderView(
        // app/Resources/views/Emails/registration.html.twig 
         'Emails/registration.html.twig', 
         array('name' => "test") 
        ), 
        'text/html' 
       ); 

Pièce jointe: $attachment = \Swift_Attachment::newInstance($pdf, $pdf_name, 'application/pdf');

deux

$message->addPart($attachment, $contentType = "application/pdf", $charset = null); 

et

$message->attach(\Swift_Attachment::fromPath('/path/to/image.jpg')->setFilename('myfilename.jpg')); 

méthodes n'existent tout simplement pas.

Étrangement, le message fort dit

Method 'attach' not found in class \Swift_Mime_MimePart less... 
Referenced method is not found in subject class. 

Mais je l'ai pas eu de succès déterminer d'où cela vient ou comment je peux appeler la classe de message correctement étant donné que la classe Swift_Mime_MimePart est vers le haut plusieurs couches la hiérarchie de classe et n'est jamais appelée ou référencée directement dans le code.

+0

Je me sens comme il ya un code manquant ici qui montrera le problème. Pouvez-vous inclure tout le code du point où vous créez la variable '$ message' au point où vous essayez d'exécuter la méthode' attach() '? – Augwa

+0

@Augwa - Il est copié à peu près directement à partir de la Swiftmailer se docs http://swiftmailer.org/docs/messages.html c'est pourquoi je suis tellement confus. Je crée le message, puis j'essaie de 'joindre() 'tout de suite. Devrait-il y avoir du code entre? –

+0

J'ai également essayé de réinstaller le bundle dans son intégralité. Je pourrais essayer de revenir à une version plus ancienne pour voir si cela corrige, mais beaucoup d'autres paquets dépendent de celui-ci comme FOSUserBundle donc je pense que cela viendrait avec un ensemble de problèmes à lui seul. –

Répondre

0

En regardant toutes les méthodes individuelles appelées, elles se terminent toutes par return $this, ce qui renvoie l'instance de l'objet en tant que type générique dans lequel la méthode est située au plus bas de la hiérarchie.

Comme il n'y a pas de chargement de type générique en PHP, retourne Swift_Mime_MimePart sera crée en tandis que les autres méthodes renvoient Swift_Mime_SimpleMessage, au lieu de ? extends Swift_Mime_MimePart ou ? extends Swift_Mime_SimpleMessage. Parce que l'exemple définit le message dans la même chaîne et setBody est la dernière méthode appelée, $message est maintenant un Swift_Mime_MimePart au lieu du Swift_Message où la méthode attach() et d'autres sont situés.

La solution est donc assez simple; mettre les appels sur des lignes séparées afin $ message reste un Swift_Message

$message = \Swift_Message::newInstance(); 
$message->setSubject('Hello Email') 
$message->setFrom('[email protected]') 
$message->setTo('[email protected]') 
$message->setBody(
        $this->renderView(
        // app/Resources/views/Emails/registration.html.twig 
         'Emails/registration.html.twig', 
         array('name' => "test") 
        ), 
        'text/html' 
       ); 
$attachment = \Swift_Attachment::newInstance($pdf, $pdf_name, 'application/pdf'); 
$message->attach($attachment);