【发布时间】:2018-06-09 23:46:46
【问题描述】:
我正在将一个项目从 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 文件中为 "Doctrine\ORM\Mapping\ClassMetadata" 创建服务?
感谢自动装配,与包含 2000 多行的旧文件相比,我的新 services.yaml 文件相当小。 新的 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 扩展的“Doctrine\ORM\EntityRepository::__construct()”:
/**
* 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
【问题讨论】:
-
是的。吉姆说什么。问题是,即使您有正确的依赖关系,您也无法简单地新建一个学说存储库。您需要使用 EntityManager::getRepository 方法,否则将无法正常工作。而且 autowire 还不够聪明,无法识别出这只是一个类型提示。
标签: php symfony doctrine symfony4