2016-05-10 14 views
0

にアクセスSymfony2のは、私がSymfony2ので働いていますし、メーラー・サービスへのアクセスが、常に、このエラーメッセージを取得しようとしていますメーラー・サービス

}非オブジェクトのメンバ関数のget() "}への私のコード:私は続きを拡張する際に私が理解から $this->get('mailer')->send($msg);

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

エラーがこの行から来ています私はこのサービスにアクセスできるはずです。サービスを特別に作成する必要はありません。

+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サービスの名前です。サービスの依存関係を管理する方法について

詳細はサービスクラスとControllerクラスを拡張しないでくださいSymfony's Book

+1

これは正解です。依存性注入はベストプラクティスであり、行く方法です。 – jahller

1

で見つけることができます。 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

関連する問題