2016-05-10 52 views
0

我與Symfony2的工作,我試圖訪問郵件服務,但不斷收到此錯誤信息:Symfony2的訪問郵件服務

{「錯誤」:{「代碼」:500,「消息」:「錯誤:呼叫一個成員函數的get()一個非對象「}}

我的代碼:

<?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); 
    } 
} 

誤差來源於此行:$this->get('mailer')->send($msg);

據我瞭解,當我伸出續滾動呼叫我應該能夠訪問此服務,而無需專門創建服務。

+3

爲什麼你需要擴展控制器類? –

+2

服務不應該擴展控制器類(除非將控制器定義爲服務,但這是一個完全不同的主題)。它不這樣工作。您應該將郵件服務作爲構造函數參數傳遞給您的'EmailServiceClass'服務。 –

+0

你能給我一個郵件服務的例子,我可以看看。 thx – John

回答

5

你應該以另一種方式做。

當你的服務是POPO(Plain Old PHP Object)時,它是最好的。同時相關性都應當通過構造函數傳遞,讓我們重構你的服務一點:

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); 
    } 
} 

現在當然你需要修改配置在服務容器此項服務的方式。

你可能有現在這樣的事情:

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

現在,你需要添加arguments線,以通過相關性:

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

最後一行定義將傳遞至理你服務的構造函數。 mailerSwift_Mailer服務的名稱。

更多有關如何管理服務相關的細節可以在Symfony's Book

+1

這是正確的答案。依賴注入是最佳實踐和方法。 – jahller

1

請找到不與服務類擴展Controller類。您應該使用services.yml注入所需的依賴關係。請實現你的服務是沿着線的東西:

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); 
    } 
} 

應用程序/配置/ services.yml

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

不要從Controller類擴展服務。而是使用依賴注入。 – jahller

+0

反對票有什麼用? – LMS94