Symfony2正在访问邮件服务


Symfony2 accessing mailer service

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

{"errors":{"code":500,"message":"Error:调用非对象上的成员函数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);
    }
}

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

据我所知,当我扩展Controller调用时,我应该能够访问此服务,而无需专门创建服务。

您应该用另一种方法。

当您的服务是POPO(普通老PHP对象)时,它是最好的。依赖关系也应该通过构造函数传递,所以让我们稍微重构一下您的服务:

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

现在,您当然需要修改在service Container中配置此服务的方式。

你现在可能有这样的东西:

services:
    your_mailer:
        class:  TestBundle'UserBundle'Utilities'EmailServiceClass

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

services:
    your_mailer:
        class:  TestBundle'UserBundle'Utilities'EmailServiceClass
        arguments:    ['@mailer']

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

有关如何管理服务依赖关系的更多详细信息,请参阅Symfony的《》一书

请不要用服务类扩展Controller类。您应该使用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('test@gmail.com');
        $this->mailer->send($msg);
    }
}

app/config/services.yml

email_service.class:
    class: TestBundle'UserBundle'Utilities'EmailServiceClass
    arguments: ['@mailer']