我正在使用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']
最后一行定义了将传递给服务的构造函数的参数。mailer
是Swift_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']