9

次のコードを使用して、コントローラーからメールを送信できます。

$message = \Swift_Message::newInstance()
    ->setSubject('Hello Email')
    ->setFrom('send@example.com')
    ->setTo('recipient@example.com')
    ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name)))
;
$this->get('mailer')->send($message);

サービス クラスから使用するには、コードをどのように変更する必要がありますか?

4

2 に答える 2

11

あなたのサービスには、特にメーラー サービスなどの外部依存関係があります。サービス コンテナ自体を注入するか、メーラー サービスを注入することができます。

サービスがメーラー サービスのみを必要とし、他に何も必要としない場合は、メーラー サービスのみを挿入することをお勧めします。

セッターを使用してメーラー サービスを挿入するように DIC を構成する方法は次のとおりです。

<service id="my.service" class="Acme\DemoBundle\Service\Hello">
    <call method="setMailer">
        <argument type="service" id="mailer" />
    </call>
</service>

クラス内で、セッターを次のように記述します。

class Hello
{
    protected $mailer;

    public function setMailer($mailer)
    {
        $this->mailer = $mailer;
    }

    public function sendEmail()
    {
        $message = \Swift_Message::newInstance()
            ->setSubject('Hello Email')
            ->setFrom('send@example.com')
            ->setTo('recipient@example.com')
            ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name)))
        ;
        $this->mailer->send($message);
    }
}

注: コントローラー内でテンプレートをレンダリングしてこのメ​​ール関数に渡すか、テンプレート サービスを挿入してサービス内でレンダリングする必要があります。

于 2012-10-18T22:26:08.880 に答える
2

サービスをどのように宣言したかによって異なります。サービスコンテナ全体を渡す場合は、何も変更する必要はありません。それ以外の場合は、少なくともメーラーとテンプレートサービスを渡し、より直接呼び出す必要があります($this->get('service')場合によっては致命的なエラーが発生しますcontainer

https://stackoverflow.com/a/12905319/258674も参照してください

于 2012-10-18T22:12:58.113 に答える