Dependency on a non-existent service "doctrine.orm.metadata.annotation_reader"
回答 3
浏览 2052
2023-01-02
所以我有一个Symfony 6.2的API,PHP 8.2的代码库。
当试图运行 composer install/update 时,显示了以下错误,我想知道如何清除它。
In CheckExceptionOnInvalidReferenceBehaviorPass.php line 83:
The service "doctrine.orm.default_annotation_metadata_driver" has a dependency
on a non-existent service "doctrine.orm.metadata.annotation_reader".
如果我把doctrine.yaml文件中的mappings部分注释掉(如下),composer就能成功运行,但是所有向api发出的POST请求都会导致以下错误。
Could not find the entity manager for class App\Entity\Token.
Check your Doctrine configuration to make sure it is configured
to load this entity’s metadata. (500 Internal Server Error)
我在这里搔首弄姿,想知道如何解决这个问题。我感觉这可能与doctrine.yaml有关,但我可能离目标很远。
composer.json:
"require": {
"php": ">=8.2",
...
"doctrine/doctrine-bundle": "^2.8",
"doctrine/doctrine-migrations-bundle": "^3.2",
"doctrine/orm": "^2.14",
...
},
doctrine.yaml:
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
orm:
auto_generate_proxy_classes: true
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
auto_mapping: true
mappings:
App:
is_bundle: false
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
你是如何创建你的应用程序的?是简单的
symfony new --webapp
还是其他更复杂的方法?听起来你好像缺少一个教义的依赖。
- Cerad 2023-01-02
随着注解的废弃,理想情况下,我们应该删除这个组件。
- Adambean 2023-02-02
3 个回答
#1楼
已采纳
得票数 8
你缺少doctrine/annotations
依赖。尝试在你的composer.json
文件中添加:
"doctrine/annotations": "^1.0",
然后运行composer update
。或者直接运行:
composer require doctrine/annotations
仅仅这样做是没有用的,而
composer require doctrine/annotations
要好得多。
- Jakumi 2023-01-03
#2楼
得票数 3
这不会是你问题的确切答案,但我的建议是动用PHP 8.1的属性,而不是教条式注释。
试图安装doctrine/annotations
,这将需要版本2.0,给我带来了与其他需要1.x版本的工具的冲突。
将你的Symfony DoctrinBundle 映射类型设为attribute
。
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
form:
...
mappings:
App:
is_bundle: false
type: attribute
关于属性设置的更多信息,可以在这里找到。
https://www.doctrine-project.org/projects/doctrine-orm/en/2.14/reference/attributes-reference.html
你还需要做什么吗?仅仅这样做并不能解决依赖性问题。
- Adambean 2023-02-02
啊,找到了,
doctrine.orm.auto_mapping
也需要false
。
- Adambean 2023-02-02
#3楼
得票数 0
你应该使用PHP 8的属性来进行路由注释,而不是使用被废弃的doctrine/annotations
包,正如他们的废弃通知中指出的那样。https://www.doctrine-project.org/projects/doctrine-annotations/en/2.0/index.html#deprecation-notice
PHP 8 introduced attributes, which are a native replacement for annotations.
As such, this library is considered feature complete,
and should receive exclusively bugfixes and security fixes.