2016-05-10 11 views
0

ich mit Symfony2 arbeite und ich versuche, Mailer-Dienst zugreifen, aber ständig diese Fehlermeldung erhalten:Symfony2 Zugriff Mailer Service

{ "Fehler": { "Code": 500, "message": "Fehler: Aufruf auf eine Elementfunktion get() auf einem nicht-Objekt "}}

meinen Code:

<?php 
namespace TestBundle\UserBundle\Utilities; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class EmailServiceClass extends Controller 
{ 
    public function sendEmail($subject, $to, $body) 
    { 
     $msg = \Swift_Message::newInstance(); 

     $msg->setSubject($subject); 
     $msg->setTo($to); 
     $msg->setBody($body); 
     $msg->setContentType('text/html'); 
     $msg->setCharset('utf-8'); 
     $msg->setFrom('[email protected]'); 

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

Der Fehler von dieser Linie kommt: $this->get('mailer')->send($msg);

von dem, was ich verstehe, wenn ich Cont verlängern roller calls Ich sollte auf diesen Dienst zugreifen können, ohne einen Dienst speziell erstellen zu müssen.

+3

Warum müssen Sie die Controller-Klasse erweitern? –

+2

Die Dienste sollten die Controller-Klasse nicht erweitern (es sei denn, Sie definieren Controller als Dienste, aber das ist ein völlig anderes Thema). So funktioniert es nicht. Sie sollten den Mailer-Service als Konstruktorparameter an Ihren Dienst 'EmailServiceClass' übergeben. –

+0

könnten Sie mir ein Beispiel für Mailer-Service geben, die ich betrachten kann. thx – John

Antwort

5

Sie sollten es anders machen.

Es ist das Beste, wenn Ihre Dienste POPO (Plain Old PHP Object) sind. Abhängigkeiten sollten auch über Konstruktor übergeben werden, also lassen Sie uns Ihren Service ein wenig Refactoring:

class EmailServiceClass //no need to extend anything 
{ 

    private $mailerService; //dependency as private property 

    //we're passing dependencies via constructor 
    public function __construct(\Swift_Mailer $mailerService) 
    { 
     $this->mailerService = $mailerService; 
    } 

    public function sendEmail($subject, $to, $body) 
    { 
     $msg = \Swift_Message::newInstance(); 

     $msg->setSubject($subject); 
     $msg->setTo($to); 
     $msg->setBody($body); 
     $msg->setContentType('text/html'); 
     $msg->setCharset('utf-8'); 
     $msg->setFrom('[email protected]'); 
     //now you can access mailer service like that 
     $this->mailerService->send($msg); 
    } 
} 

Jetzt natürlich müssen Sie die Art und Weise Sie diesen Service in Service Container konfigurieren ändern.

Sie haben wahrscheinlich so etwas wie dies jetzt:

services: 
    your_mailer: 
     class: TestBundle\UserBundle\Utilities\EmailServiceClass 

Jetzt müssen Sie arguments Zeile hinzufügen, um Abhängigkeiten zu übergeben:

services: 
    your_mailer: 
     class: TestBundle\UserBundle\Utilities\EmailServiceClass 
     arguments: ['@mailer'] 

Die letzte Zeile definiert Argumente, die es zu übergeben wird Ihre Service-Konstruktor. mailer ist der Name Swift_Mailer Service.

Weitere Informationen darüber, wie Service-Abhängigkeiten verwalten können in Symfony's Book

+1

Dies ist die richtige Antwort. Dependency-Injektion ist die beste Praxis und der Weg zu gehen. – jahller

1

Bitte nicht verlängern die Controller-Klasse mit einer Serviceklasse zu finden. Sie sollten die Abhängigkeiten, die Sie benötigen, mit services.yml einspeisen. Bitte implementieren Sie da etwas entlang der Linien von sein:

MyController.php:

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class MyController extends Controller 
{ 
    public function sendEmailAction() 
    { 
     $subject = //.. 
     $to = //.. 
     $body = //.. 

     $this->get('email_service.class')->sendEmail($subject, $to, $body); 

     // Return a template, or redirect here.. 
     return new Response(); 
    } 
} 

EmailServiceClass.php

class EmailServiceClass 
{ 
    private $mailer; 

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

    public function sendEmail($subject, $to, $body) 
    { 
     $msg = \Swift_Message::newInstance(); 

     $msg->setSubject($subject); 
     $msg->setTo($to); 
     $msg->setBody($body); 
     $msg->setContentType('text/html'); 
     $msg->setCharset('utf-8'); 
     $msg->setFrom('[email protected]'); 

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

app/config/services.yml

email_service.class: 
    class: TestBundle\UserBundle\Utilities\EmailServiceClass 
    arguments: ['@mailer'] 
+0

Erweitern Sie keinen Dienst von der Controller-Klasse. Verwenden Sie stattdessen die Abhängigkeitsinjektion. – jahller

+0

Was ist mit der Abstimmung unten? – LMS94