Symfony 4怎么实现Doctrine XML ORM映射?

8

Symfony 4文档没有清晰地说明如何使用XML orm映射代替注释。在官方文档中看不到这样重要的部分的详细信息,这让人感到非常沮丧。

1个回答

12

想象一下YourDomain\Entity\Customer领域对象:

<?php declare(strict_types=1);

namespace YourDomain\Entity;

class Customer
{
    private $id;
    private $email;
    private $password;

    public function __construct(string $email)
    {
        $this->setEmail($email);
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getEmail(): string
    {
        return $this->email;
    }

    public function setEmail(string $email): void
    {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new \InvalidArgumentException('Not a valid e-mail address');
        }

        $this->email = $email;
    }

    public function getPassword(): ?string
    {
        return $this->password;
    }

    public function setPassword(?string $password): void
    {
        $this->password = $password;
    }
}

首先定义您自己的映射:

orm:
    mappings:
        YourDomain\Entity:
            is_bundle: false
            type: xml
            // this is the location where xml files are located, mutatis mutandis
            dir: '%kernel.project_dir%/../src/Infrastructure/ORM/Mapping'
            prefix: 'YourDomain\Entity'
            alias: YourDomain

文件名必须匹配模式[class_name].orm.xml,在您的情况下为Customer.orm.xml。如果您有子命名空间,例如值对象YourDomain\Entity\ValueObject\Email,则文件的名称必须命名为ValueObject.Email.orm.xml

映射示例:

<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                   https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">
    <entity name="YourDomain\Entity\Customer" table="customer">
        <id name="id" type="integer" column="id">
            <generator strategy="AUTO"/>
        </id>
        <field name="email" type="email" unique="true"/>
        <field name="password" length="72"/>
    </entity>
</doctrine-mapping>

祝好运。


谢谢emix。在创建xml映射后,你使用了哪个命令来生成实体?比如make:entity或doctrine:generate:entities? - Nero
3
我从不这样做。我有一个“领域优先”的态度。一旦领域模型完成并覆盖了单元测试,我才会进行映射。 - Mike Doe
1
你有一个以数据库为先的态度,而我个人根本不需要数据库,因为如果一切都基于接口,数据库只是一个实现细节,但这不是讨论这个问题的地方。如果我的回答对你有帮助,请考虑点赞并将其标记为解决方案。祝你好运。如果你对此感到好奇,请阅读更多关于SOLID和GRASP原则、DDD模式、优秀代码等方面的内容。 - Mike Doe
这个emix的扩展信息很酷。但回到实体,我可以假设你不赞成让Doctrine自动创建某些东西吗? - Nero
好的,这有些偏离主题了。这是我第一次听说贫血领域模型。在我看来,实体对象的目的是提供一个层,将表列映射到对象属性。当将获取样式设置为PDO::FETCH_CLASS或PDO::FETCH_INTO时,它是提供给准备语句的获取方法的类。因此,我认为它应该保持简单,换句话说就是贫血。对于那些感兴趣的人,请参考https://github.com/symfony/symfony-docs/issues/7460。 - Nero
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接