Doctrine PHP 8 Attributes
Asked Answered
P

2

7

I use PHP8, Symfony 5.2 and Doctrine 3.0 in my project, But the PHP 8 attributes, allowed since Doctrine 2.9, doesn't seem to work.

use Doctrine\ORM\Mapping\Entity;

**
* @Entity(repositoryClass="App\Repository\MyClassRepository")
*/
class MyClass
{

works fine.

use Doctrine\ORM\Mapping\Entity;

#[Entity(repositoryClass: MyClassRepository::class)]
class MyClass
{

Return [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

here is my 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.*"
Poetry answered 16/4, 2021 at 14:16 Comment(5)
Maybe because 3.0 has not been released yet? I would imagine the doctrine bundle would need at least a few tweaks.Automatize
Have you imported MyClassRepository?Joellyn
@Cerad, yeah, I think you're right. Probably the doctrine bundle needs a few adjustments. Thanks.Poetry
@miken32, what do you mean by imported ?Poetry
PHP 8 attributes for Doctrine ORM Symfony configuration was not fully supported until doctrine/doctrine-bundle 2.4+. ^2.3 should install it, but it may have been locked prior. The Symfony doctrine mapping type declaration config still defaults to annotation.Huggermugger
T
5

This is because of doctrine bundle configuration. If all entities within the bundle use attributes just switch the metadata driver from "annotation" to "attribute"

doctrine:
    orm:
        auto_generate_proxy_classes: true
        entity_managers:
            default:
                ...
                mappings:
                    MyBundle:
                        type: attribute

If some entities within a bundles use attributes and some others annotations - than it is better either choose only one format for metadata or implement a custom metadata driver.

Tappet answered 29/6, 2021 at 21:52 Comment(1)
Here is the Symfony documentation for any who are wanting, Doctrine Config Reference. It is important to note the documentation for PHP 8 attributes support was added in Symfony 5.3+Huggermugger
I
2

The solution is use a custom AnnotationDriver.

Sample fully works implementation: https://github.com/baraja-core/doctrine/blob/master/src/Orm/Mapping/AnnotationDriver.php

Imperfection answered 13/7, 2021 at 20:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.