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