我正在将一个项目从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
我的问题是一个错误的命名空间。文件真正的位置是应用\基础设施\MySQL\Rubric\规范
但是命名空间被设置为应用\基础设施\Rubric\规范
结果“[诸如此类]但不存在此类服务”。
您真的需要将服务定义添加到第三方供应商类的services.yaml吗?
不,不要那样做。我个人的建议是:不要扩展EntityRepository
。曾经您不希望存储库的接口具有类似createQuery
或flush
的方法。至少,如果你认为一个存储库就像一个对象集合一样,你就不需要它。如果扩展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.
}
不需要其他步骤。
从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 类内容扩展控制器 所以,在运行内容页面后,我得到了以下