Symfony 3.3.5配置服务
我有一些类ObjectManager,想要为他创建服务,我创建配置Symfony 3.3.5配置服务,symfony,Symfony,我有一些类ObjectManager,想要为他创建服务,我创建配置 services: _defaults: autowire: true autoconfigure: true public: false AppBundle\: resource: '../../src/AppBundle/*' exclude: '../../src/AppBundle/{Entity,Repository,Tests}' AppBundle\Service\:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
AppBundle\:
resource: '../../src/AppBundle/*'
exclude: '../../src/AppBundle/{Entity,Repository,Tests}'
AppBundle\Service\:
resource: '../../src/AppBundle/Service'
public: true
app.object_manager:
class: AppBundle\Service\ObjectManager
arguments:
- '@jms_serializer'
- '@validator'
在控制器中获取此服务后,出现错误
$objectManager = $this->get('app.object_manager');
You have requested a non-existent service "app.object_manager".
为什么会发生这种情况,symfony 3.3.5对配置服务有不同的方式吗 如果您想通过get()使用服务,则需要显式地将您的服务定义为public,因为Symfony 3
此处提供更多信息-首先,当您希望能够使用get调用服务时,必须将其定义为public
app.object_manager:
class: AppBundle\Service\ObjectManager
public: true
但您也可以在services.yml顶部这样做,以定义所有服务都是公共的:
services:
_defaults:
autowire: true
autoconfigure: true
public: true
这样,您就不必在每次服务中都显式地执行此操作
此外,我建议您使用Symfony的新自动布线功能。这样,您就不必在services.yml中定义服务
只需在ObjectManager类中定义构造函数,如下所示:
class ObjectManager
{
private $jms_serializer;
private $validator;
public function __construct(SerializerInterface $jms_serializer, ValidatorInterface $validator)
{
$this->jms_serializer = $jms_serializer;
$this->validator = $validator;
}
}
他将通过自动接线找到正确的服务。您不必在services.yml中定义任何内容
因此,总结一下您的services.yml应该只包含以下内容:
services:
_defaults:
autowire: true
autoconfigure: true
public: true
AppBundle\:
resource: '../../src/AppBundle/*'
exclude: '../../src/AppBundle/{Entity,Repository,Tests}'
实际上,您可以使用Symfony 3.3+来实现它的功能 如果我理解正确,您需要将
AppBundle\Service\ObjectManager
发送到控制器
那样的话
1.修改您的服务。yml
2.通过构造函数要求AppBundle\Service\ObjectManager
(任何需要的地方)
就这些
没什么特别的,只是纯粹的Symfony令人敬畏 public:false现在是默认值,这意味着无法通过Container::get()访问服务。将public:true添加到服务定义中。更好的是,看看如何将您的服务直接注入到操作方法中。
services:
_defaults:
autowire: true
autoconfigure: true
public: true
AppBundle\:
resource: '../../src/AppBundle/*'
exclude: '../../src/AppBundle/{Entity,Repository,Tests}'
services:
_defaults:
autowire: true
AppBundle\:
resource: '../../src/AppBundle/*'
exclude: '../../src/AppBundle/{Entity,Repository,Tests}'
use AppBundle\Service\ObjectManager;
final class MyController
{
/**
* @var ObjectManager
*/
private $objectManager;
public function __construct(ObjectManager $objectManager)
{
$this->objectManager = $objectManager;
}
public function someAction()
{
$this->objectManager->someCoolMethod();
}
}