我开始使用Symfony中的服务,因此从symfony文档创建了示例服务:
namespace AppBundle\Service;
use Psr\Log\LoggerInterface;
class MessageGenerator
{
private $logger;
public function __construct(LoggerInterface $logger){
}
public function getMessage()
{
$this->logger->info('Success!');
}
}
我在我的控制器中调用该服务(我也有使用声明:
:use AppBundle\Service\MessageGenerator;
$messageGenerator = $this->get(MessageGenerator::class);
$message = $messageGenerator->getMessage();
$this->addFlash('success', $message);
我的服务在services.yml文件中定义:
app.message_generator:
class: AppBundle\Service\MessageGenerator
public: true
所以在我看来,我完全按照文档中所描述的那样做了所有事情并且在调用时:
php app/console debug:container app.message_generator
在我的命令行中,我得到了我的服务:
Option Value
------------------ ------------------------------------
Service ID app.message_generator
Class AppBundle\Service\MessageGenerator
Tags -
Scope container
Public yes
Synthetic no
Lazy no
Synchronized no
Abstract no
Autowired no
Autowiring Types -
现在,当我执行控制器功能时,我会调用我的服务,但仍然会收到错误:
You have requested a non-existent service "appbundle\service\messagegenerator".
有什么想法吗?
答案 0 :(得分:1)
Symfony在命名方面有点令人困惑:您通过其定义的名称app.message_generator
请求服务来检索服务。
$messageGenerator = $this->get('app.message_generator');
答案 1 :(得分:1)
Symfony最近建议从您定义服务的名称(app.message_generator
)切换到类名(AppBundle\Service\MessageGenerator
)。他们都只是一个名字'打电话给服务。
当仅定义给定名称时,您尝试使用两者。
从长远来看,它建议使用基于::class
的名称,并且很可能允许框架自己查找类,并自行配置它们。这意味着,默认情况下,所有服务都是私有的,并由框架&它的服务容器。
与此同时,在学习的过程中,您可以:
$messageGenerator = $this->get('app.message_generator');
或定义明确定义服务,并将其公开,以便可以从容器中使用->get(...)
获取它。
# services.yml
AppBundle\Service\MessageGenerator:
class: AppBundle\Service\MessageGenerator
public: true
# php controller
$messageGenerator = $this->get(MessageGenerator::class);
或仅在请求时自动注入控制器
public function __construct(LoggerInterface $logger, MessageGenerator $msgGen)
{
$this->messageGenerator = $msgGen;
}
public function getMessage()
{
$result = $this->messageGenerator->do_things(....);
$this->logger->info('Success!');
}