2012-04-20 26 views
5

ich verwende Symfony2 und FOSUserBundleEmail Outside-Controller Aktion Symfony2

Ich habe E-Mail senden mit Swiftmailer in meinem Mailer-Klasse, die kein Controller ist oder seine Wirkung zeige ich, was ich codiert haben

<?php 

namespace Blogger\Util; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class FlockMailer { 


    public function SendEmail(){ 
     $message = \Swift_Message::newInstance() 
     ->setSubject('Hello Email') 
     ->setFrom('[email protected]') 
     ->setTo('[email protected]') 
     ->setBody('testing email'); 

     $this->get('mailer')->send($message); 
    } 
} 

Aber ich die folgende Fehlermeldung erhalten

Fatal error: Call to undefined method Blogger\Util\FlockMailer::get() .... 

Kann jede Stelle mir diese Hilfe wirklich fustrating me .....

+0

Ich verstehe es nicht. Ist das Code-Snippet Ihre aktuelle Lösung, aber Sie möchten das Mailing an einen anderen Ort verschieben? Wenn das korrekt ist, sollten Sie wahrscheinlich über das Einfügen von Diensten in Ihre benutzerdefinierten Klassen lesen: http://stackoverflow.com/questions/6124444/how-can-i-access-a-service-outside-of-a-controller-with- symfony2 – geca

+0

Ich habe FOSUserBundle und FOSFacebookbundle verwendet, was ich will, wenn Benutzer erfolgreich mit Facebook-Konto anmelden Ich möchte E-Mail an den Benutzer mit seinem Passwort senden, damit er sich mit diesem E-Mail-Passwort anmelden kann ich Funktion in Provider-Klasse schreiben, um E-Mails zu senden .... –

Antwort

1

Vergessen Sie über den Setter und Getter:

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

Das ist für mich mit dem MailHelper von einer Listener-Methode namens gearbeitet.

8

BEARBEITEN: Da ich den Code nicht getestet habe, sollten Sie auch die Transportschicht angeben, wenn Sie den Service-Container nicht zum Abrufen der Instanz des Mailers verwenden. Sehen Sie sich an: http://swiftmailer.org/docs/sending.html

Sie tun es falsch. Sie möchten grundsätzlich einen Service, keine Klasse, die Controller erweitert. Es funktioniert nicht, weil der Service-Container in der Funktion SendMail() nicht verfügbar ist.

Sie müssen den Service-Container in Ihre eigene benutzerdefinierte Helfer für das Senden von E-Mails injizieren. Einige Beispiele:

namespace Blogger\Util; 

class MailHelper 
{ 
    protected $mailer; 

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

    public function sendEmail($from, $to, $body, $subject = '') 
    { 
     $message = \Swift_Message::newInstance() 
      ->setSubject($subject) 
      ->setFrom($from) 
      ->setTo($to) 
      ->setBody($body); 

     $this->mailer->send($message); 
    } 
} 

Um es in einer Controller-Aktion zu verwenden:

services: 
    mail_helper: 
     class:  namespace Blogger\Util\MailHelper 
     arguments: ['@mailer'] 

public function sendAction(/* params here */) 
{ 
    $this->get('mail_helper')->sendEmail($from, $to, $body); 
} 

oder anderswo , ohne die Service-Container Zugriff:

class WhateverClass 
{ 

    public function whateverFunction() 
    { 
     $helper = new MailerHelper(new \Swift_Mailer); 
     $helper->sendEmail($from, $to, $body); 
    } 

} 

Oder in einem benutzerdefinierten Service Zugriff auf den Container:

namespace Acme\HelloBundle\Service; 

class MyService 
{ 
    protected $container; 

    public function setContainer($container) { $this->container = $container; } 

    public function aFunction() 
    { 
     $helper = $this->container->get('mail_helper'); 
     // Send email 
    } 
} 

services: 
    my_service: 
     class: namespace Acme\HelloBundle\Service\MyService 
     calls: 
      - [setContainer, ['@service_container']] 
+0

Ich habe ohne Zugriff auf den Service-Container folgenden Fehler implementiert come ====== Abfangbar Fataler Fehler: Argument 1 an Swift_Mailer übergeben :: __ construct() muss eine Instanz von Swift_Transport sein, keine Angabe, –

+0

@MuhammadUmair ja , müssen Sie die Transportschicht angeben. Ich habe den Code nicht getestet. Sie sollten folgen http://symfony.com/doc/current/cookbook/email/email.html – gremo

+0

@MuhammadUmair auch einen Blick auf http://swiftmailer.org/docs/sending.html – gremo