当前位置: 首页 > 知识库问答 >
问题:

无法自动连线服务:参数引用类,但不存在此类服务

澹台臻
2023-03-14

我正在将一个项目从Symfony 3升级到Symfony 4(https://github.com/symfony/symfony/blob/master/UPGRADE-4.0.md),我有很多这样的存储库/服务:

namespace App\Entity;

use App\Entity\Activation;
use Doctrine\ORM\EntityRepository;
use Predis\Client;

class ActivationRepository extends EntityRepository
{
    // ...
}

当我尝试在浏览器中这样运行项目时:

http://localhost:8000/login

我得到这个错误:

(1/1) RuntimeException
Cannot autowire service "App\Entity\ActivationRepository": 
argument "$class" of method 
"Doctrine\ORM\EntityRepository::__construct()" 
references class "Doctrine\ORM\Mapping\ClassMetadata" 
but no such service exists.

这是否意味着您必须在services.yaml文件中为“条令\ORM\Mapping\ClassMetadata”创建服务?

由于自动连接,我的新services.yaml文件与旧文件相比相当小,旧文件有2000行。到目前为止,新的services.yaml只有以下几个服务:

App\:
    resource: '../src/*'

# Controllers
App\Controller\:
    resource: '../src/Controller'
    autowire: true
    public: true
    tags: ['controller.service_arguments']

# Models
App\Model\:
    resource: '../src/Model/'
    autowire: true
    public: true

// etc

问题:您真的需要为第三方供应商类的services.yaml添加服务定义吗?如果是这样的话,我能举个例子说明如何做到这一点吗?任何已经从Symfony 3升级到Symfony 4的人的建议都是非常好的。

PHP 7.2.0-2 ubuntu16.04.1 deb.sury.org 2(cli)(构建时间:2017年12月7日20:14:31)(NTS)Linux Mint 18,Apache2 Ubuntu。

编辑/仅供参考:

这是ActivationRepository扩展的“条令\ORM\EntityRepository::\uu构造()”:

/**
     * Initializes a new <tt>EntityRepository</tt>.
     *
     * @param EntityManager         $em    The EntityManager to use.
     * @param Mapping\ClassMetadata $class The class descriptor.
     */
    public function __construct(EntityManagerInterface $em, Mapping\ClassMetadata $class)
    {
        $this->_entityName = $class->name;
        $this->_em         = $em;
        $this->_class      = $class;
    }

位于此处:

/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php

共有3个答案

慕铭
2023-03-14

我的问题是一个错误的命名空间。文件真正的位置是应用\基础设施\MySQL\Rubric\规范但是命名空间被设置为应用\基础设施\Rubric\规范

结果“[诸如此类]但不存在此类服务”。

司英飙
2023-03-14

您真的需要将服务定义添加到第三方供应商类的services.yaml吗?

不,不要那样做。我个人的建议是:不要扩展EntityRepository。曾经您不希望存储库的接口具有类似createQueryflush方法。至少,如果你认为一个存储库就像一个对象集合一样,你就不需要它。如果扩展EntityRepository,您将有一个泄漏的抽象。

相反,您可以将EntityManager插入存储库中,就是这样:

use App\Entity\Activation;
use App\Repository\ActivationRepository;
use Doctrine\ORM\EntityManagerInterface;

final class DoctrineActivationRepository implements ActivationRepository
{
    private $entityManager;
    private $repository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
        $this->repository = $this->entityManager->getRepository(Activation::class);
    }

    public function store(Activation $activation): void
    {
        $this->entityManager->persist($activation);
        $this->entityManager->flush();
    }

    public function get($id): ?Activation
    {
        return $this->repository->find($id);
    }

    // other methods, that you defined in your repository's interface.
}

不需要其他步骤。

杜正奇
2023-03-14

从DoctrineBundle的1.8版本开始,您可以使用Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository而不是Doctrine\ORM\EntityRepository来扩展类。结果将是相同的,但这确实支持autowire。

示例:

use App\Entity\Activation;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;

class ActivationRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Activation::class);
    }

    // ...
}
 类似资料:
  • 问题内容: 如果Service类使用Validated注释进行注释,则同一类无法自动装配自身。 这是在Spring Context尝试加载时引发的异常: 同样,当您有很多依赖于类的自身时,就会发生这种情况(当某个服务使用使用第一个服务的其他服务时)。我想知道@Validated注解,但是我总是在bean上遇到同样的错误。 有人知道我该怎么解决吗? 问题答案: 在这种情况下,注释与错误的自动装配无关

  • 所以我上周创建了一个新的Symfony 4.1项目,并一直在努力解决它,没有任何问题。直到昨天我开始使用一些第三方依赖项。我通过使用安装了GuzzleClient。就我所知,这个包安装得很好。 但是,当我尝试将此服务注入代码中的构造函数(事件或命令)时,会收到错误消息:

  • 我创建了使用jdbc处理DB的Dao存储库。 我在我的服务类中自动连接了这个存储库。 然后我尝试在测试类中自动连接我的服务类。 当我开始测试时,我得到下一个错误: 服务中构造函数的参数0需要找不到DaoImpl类型的bean。 我如何解决我的问题?

  • 我正在尝试创建一个Spring Boot测试类,它应该创建Spring上下文,并自动连接服务类以供我测试。 这就是我得到的错误: 原因:org。springframework。豆。工厂NoSuchBeanDefinitionException:没有“com”类型的合格bean。目瞪口呆。戈布斯。基础服务FileImportService'可用:至少需要1个符合autowire候选资格的bean。依

  • 我已经用@Autowired注释为相应的存储库定义了服务类 存储库接口定义为从JpaReepository扩展 应用程序自动编译服务类 运行时,我得到以下错误

  • 我目前正在使用Symfony 4和Doctrine MongoDB捆绑包,遵循此链接中的说明:DoctrineMongoDBBundle。因此,我有一个用户文档: src/Document/UserDocument。php src/Repository/UserRepository。php src/Controller/Content。php 类内容扩展控制器 所以,在运行内容页面后,我得到了以下