首页 文章

Symfony 3.3将存储库注入服务

提问于
浏览
4

我有一个捆绑包,它存放在一个私有的Satis存储库中,因为它的实体和存储库在多个应用程序之间共享 .

使用该捆绑包的其余应用程序是Symfony 2.7和2.8应用程序 . 我正在开发一个新的应用程序,要求是使用Symfony 3.3 .

在symfony 3.3应用程序中,我在我的services.yml中尝试了这个:

# Learn more about services, parameters and containers at
# http://symfony.com/doc/current/service_container.html
parameters:
    #parameter_name: value

services:
# default configuration for services in *this* file
    _defaults:
        autowire: true
        autoconfigure: true
        # this means you cannot fetch services directly from the container via $container->get()
        # if you need to do this, you can override this setting on individual services
        public: false

    # makes classes in src/AppBundle available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    CbmLtd\UvmsBundle\:
        resource: '../../vendor/cbmltd/uvms-bundle/*'
        exclude: '../../vendor/cbmltd/uvms-bundle/{Entity,Repository}'

    UvmsApiV1Bundle\:
        resource: '../../src/UvmsApiV1Bundle/*'
        exclude: '../../src/UvmsApiV1Bundle/{Entity,Repository}'

以上给出了以下例外:

无法自动装配服务“UvmsApiV1Bundle \ Service \ DealerService”:方法“__construct()”的参数“$ repository”引用类“CbmLtd \ UvmsBundle \ Repository \ DealerRepository”但不存在此类服务 . 它无法自动注册,因为它来自不同的根命名空间 .

好的,所以我想我需要明确地将此存储库声明为服务 . 我在Symfony 3.3文档中找不到关于将存储库声明为服务的任何内容,2.8语法也不起作用 .

我把它添加到我的services.yml:

services:
    ...
    CbmLtd\UvmsBundle\DealerRepository:
        class: CbmLtd\UvmsBundle\Entity\DealerRepository
        factory_service: doctrine.orm.entity_manager
        factory_method: getRepository
        arguments:
            - CbmLtd\UvmsBundle\Entity\Dealer

但我仍然得到这个例外:

无法自动装配服务“UvmsApiV1Bundle \ Service \ DealerService”:方法“__construct()”的参数“$ repository”引用类“CbmLtd \ UvmsBundle \ Repository \ DealerRepository”但不存在此类服务 . 它无法自动注册,因为它来自不同的根命名空间 .

我无法对CbmLtd \ UvmsBundle进行任何更改,因为它被多个应用程序使用 . 任何帮助,将不胜感激 . 我真的花了好几个小时,这非常令人沮丧 .

4 回答

  • 1

    我能够使用以下services.yml执行此操作:

    services:
    # default configuration for services in *this* file
        _defaults:
            autowire: true
            autoconfigure: true
    
        # this means you cannot fetch services directly from the container via $container->get()
        # if you need to do this, you can override this setting on individual services
        public: false
    
        # makes classes in src/AppBundle available to be used as services
        # this creates a service per class whose id is the fully-qualified class name
        CbmLtd\UvmsBundle\:
            resource: '../../vendor/cbmltd/uvms-bundle/*'
            exclude: '../../vendor/cbmltd/uvms-bundle/{Entity,Repository}'
    
        CbmLtd\UvmsBundle\Repository\DealerRepository:
            factory: doctrine.orm.entity_manager:getRepository
            arguments:
                - CbmLtd\UvmsBundle\Entity\Dealer
    
        UvmsApiV1Bundle\:
            resource: '../../src/UvmsApiV1Bundle/*'
            exclude: '../../src/UvmsApiV1Bundle/{Entity,Repository}'
    

    我不得不稍微改变我的控制器,但它现在正在工作 .

  • -1

    2018+ and Symfony 3.3+ answer

    您可以进一步使用Repositories as Services .

    这样你就可以在服务配置中使用Symfony的自动装配和简单配置 .

    1.服务

    services:
        _defaults:
            autowire: true
            autoconfigure: true
    
        CbmLtd\UvmsBundle\:
            resource: '../../vendor/cbmltd/uvms-bundle/*'
            exclude: '../../vendor/cbmltd/uvms-bundle/{Entity}'
    
        UvmsApiV1Bundle\:
            resource: '../../src/UvmsApiV1Bundle/*'
            exclude: '../../src/UvmsApiV1Bundle/{Entity}'
    

    2.存储库

    namespace CbmLtd\UvmsBundle\Repository\DealerRepository;
    
    final class DealerRepository
    {
        /**
         * @var Doctrine\ORM\EntityRepository
         */
        private $repository;
    
        public function __construct(EntityManagerInterface $entityManager)
        {
            $this->repository = $entityManager->getRepository(Dealer::class);
        }
    
        public function find($id)
        {
            return $this->repository->find($id);
        }
    }
    
  • -1

    尝试更改存储库服务声明

    your_bundle.your_entity_repository:
        class: Doctrine\ORM\EntityRepository
        factory: ['@doctrine.orm.default_entity_manager', getRepository]
        arguments:
            - YourBundle\Entity\YourEntity
    

    然后通过像这样引用它来注入repo:

    your_bundle.your_service:
        class: YourBundle\Service\YourService
        arguments:
            - "@your_bundle.your_entity_repository"
        calls:
            - [setContainer, ['@service_container']]
    
  • 5

    您的服务声明中有拼写错误,您忘记了“存储库”命名空间 . 此外,该类是位于“实体”还是“存储库”中?服务标识应与实际的完全限定类名相同 . 在services.yml中,尝试:

    CbmLtd\UvmsBundle\Repository\DealerRepository:
        class: CbmLtd\UvmsBundle\Repository\DealerRepository
    

    代替:

    CbmLtd\UvmsBundle\DealerRepository:
        class: CbmLtd\UvmsBundle\Entity\DealerRepository
    

相关问题