Symfony2访问邮件服务

Joh*_*ohn 0 php symfony

我正在使用Symfony2并尝试访问邮件服务,但不断收到此错误消息:

{"errors":{"code":500,"message":"错误:在非对象上调用成员函数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('test@gmail.com');

        $this->get('mailer')->send($msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误来自这一行: $this->get('mailer')->send($msg);

根据我的理解,当我扩展Controller调用时,我应该能够访问此服务而无需专门创建服务.

Jak*_*zak 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('test@gmail.com');
        //now you can access mailer service like that
        $this->mailerService->send($msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您需要修改在Service Container中配置此服务的方式.

你现在可能有这样的事情:

services:
    your_mailer:
        class:  TestBundle\UserBundle\Utilities\EmailServiceClass
Run Code Online (Sandbox Code Playgroud)

现在您需要添加arguments行以传递依赖项:

services:
    your_mailer:
        class:  TestBundle\UserBundle\Utilities\EmailServiceClass
        arguments:    ['@mailer']
Run Code Online (Sandbox Code Playgroud)

最后一行定义了将传递给服务构造函数的参数.mailerSwift_Mailer服务的名称.

有关如何管理服务依赖关系的更多细节可以在Symfony的书中找到