PHP 8 属性

Chu*_*ris 7 php symfony doctrine-orm symfony5

我在我的项目中使用 PHP8、Symfony 5.2 和 Doctrine 3.0,但是自Doctrine 2.9以来允许的 PHP 8 属性似乎不起作用。

use Doctrine\ORM\Mapping\Entity;

**
* @Entity(repositoryClass="App\Repository\MyClassRepository")
*/
class MyClass
{
Run Code Online (Sandbox Code Playgroud)

工作正常。

use Doctrine\ORM\Mapping\Entity;

#[Entity(repositoryClass: MyClassRepository::class)]
class MyClass
{
Run Code Online (Sandbox Code Playgroud)

返回[critical] Uncaught PHP Exception Doctrine\ORM\Mapping\MappingException: "Class "App\Entity\MyClass" is not a valid entity or mapped super class." at .../vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/MappingException.php line 378

这是我的composer.json:

"composer/package-versions-deprecated": "1.11.99.1",
"doctrine/doctrine-bundle": "^2.3",
"doctrine/doctrine-migrations-bundle": "^3.1",
"doctrine/orm": "^3.0",
"symfony/console": "5.2.*",
"symfony/dotenv": "5.2.*",
"symfony/flex": "^1.3.1",
"symfony/framework-bundle": "5.2.*",
"symfony/proxy-manager-bridge": "5.2.*",
"symfony/yaml": "5.2.*"
Run Code Online (Sandbox Code Playgroud)

小智 5

这是因为学说捆绑配置。如果包中的所有实体都使用属性,只需将元数据驱动程序从“注释”切换为“属性”

doctrine:
    orm:
        auto_generate_proxy_classes: true
        entity_managers:
            default:
                ...
                mappings:
                    MyBundle:
                        type: attribute
Run Code Online (Sandbox Code Playgroud)

如果包中的某些实体使用属性和其他一些注释 - 最好只选择一种元数据格式或实现自定义元数据驱动程序。

  • 这是 Symfony 文档,供任何需要的人使用,[Doctrine 配置参考](https://symfony.com/doc/current/reference/configuration/doctrine.html#type)。值得注意的是 Symfony 5.3+ 中添加了 PHP 8 属性支持的文档 (2认同)