10分ぐらいで学べるSymfony2 〜メール送信サービス作成編〜

Symfony2ではある機能を利用する際にクラスをnewして呼び出すのではなく
サービスとして呼び出すみたいな事を行います。
今回は仮登録メールを送信するサービスを実装する例として実装します


(1)サービスクラスの作成
サービスの本体を作成します。
Symfony2本体のメール設定は設定済とし、呼び出し元で「UserTemporary」にemailとtokenを設定します。

$ mkdir src/Root/UserBundle/Mailer
$ vi src/Root/UserBundle/Mailer/Mailer.php
<?php

namespace Root\UserBundle\Mailer;

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\Routing\RouterInterface;
use Root\UserBundle\Entity\UserTemporary;

class Mailer
{
    protected $mailer;
    protected $router;
    protected $templating;
    protected $parameters;

    public function __construct($mailer, RouterInterface $router, EngineInterface $templating, array $parameters)
    {
        $this->mailer = $mailer;
        $this->router = $router;
        $this->templating = $templating;
        $this->parameters = $parameters;
    }

    public function sendConfirmationEmailMessage(UserTemporary $user)
    {
        $template = $this->parameters['confirmation.template'];
        $url = $this->router->generate('register_input', array('token' => $user->getToken()), true);
        $rendered = $this->templating->render($template, array(
            'confirmationUrl' =>  $url
        ));

        $this->sendEmailMessage($rendered, $this->parameters['from_email']['confirmation'], $user->getEmail());
    }

    protected function sendEmailMessage($renderedTemplate, $fromEmail, $toEmail)
    {
        // Render the email, use the first line as the subject, and the rest as the body
        $renderedLines = explode("\n", trim($renderedTemplate));
        $subject = $renderedLines[0];
        $body = implode("\n", array_slice($renderedLines, 1));

        $message = \Swift_Message::newInstance()
            ->setSubject($subject)
            ->setFrom($fromEmail)
            ->setTo($toEmail)
            ->setBody($body);

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


(2)メールの文章(テンプレート)を作成
このサービスでは1行目をサブジェクト、2行目以降をメール本文としてます。

$ vi src/Root/UserBundle/Resources/views/Registration/email.txt.twig
[hoge] 仮登録メール
こんにちは!

下記URLをクリックして会員登録続行しておくれ
{{ confirmationUrl }}


(3)サービスの登録
サービスとしてSymfony2に登録を行います。これで利用できる状態となります。

$ vi src/Root/UserBundle/Resources/config/services.yml
parameters:
    my_user.mailer.class: Root\UserBundle\Mailer\Mailer
    mailer_parameter:
        confirmation.template: 'RootUserBundle:Registration:email.txt.twig'
        from_email:
            confirmation:      'xxxxxx@xxxxx'
services:
    my_user.mailer:
        class: %my_user.mailer.class%
        arguments: [@mailer, @router, @templating, %mailer_parameter%]


(4)ルーティングの設定
サービスの中でURLを生成してるのでルーティングの設定が必要ですね

register_input:
    pattern:   /register/input/{token}
    defaults:  { _controller: RootUserBundle:Registration:input }

(5)呼び出し
「$user_temporary」にはemailとtokenを設定するとあら不思議メールが送信されちゃいます!

$user_temporary->setEmail($to_mail);
$user_temporary->setToken($token);
$mailer = $this->container->get('my_user.mailer');
$mailer->sendConfirmationEmailMessage($user_temporary);