我正在使用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调用时,我应该能够访问此服务而无需专门创建服务.
你应该采取另一种方式.
当您的服务是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)
最后一行定义了将传递给服务构造函数的参数.mailer是Swift_Mailer服务的名称.
有关如何管理服务依赖关系的更多细节可以在Symfony的书中找到
| 归档时间: |
|
| 查看次数: |
784 次 |
| 最近记录: |