Symfony 3.3.5配置服务

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\:

我有一些类ObjectManager,想要为他创建服务,我创建配置

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