Symfony 4 как реализовать отображение ORM в Doctrine XML

В документе Symfony 4 неясно, как использовать XML-сопоставление orm вместо аннотаций. Довольно неприятно видеть отсутствие подробностей этой важной части в официальной документации.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
4 740
1

Ответы 1

Представьте себе доменный объект 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: entity?

Nero 24.10.2018 09:21

Я никогда этого не делаю. Я придерживаюсь принципа «превыше всего». Я выполняю сопоставление после того, как модель предметной области будет завершена и покрыта модульными тестами.

emix 24.10.2018 09:22

Вы имеете в виду, что создаете файл объекта вручную? Я пришел из Symfony 3, и теперь у меня нет идей по этому поводу. Я нашел thinktocode.com/2018/04/19/doctrine-xml-mapping-or-annotatio‌ ns, но он не упоминает подробностей о том, как сгенерировать сущность.

Nero 24.10.2018 09:28

Верно. Зачем вообще нужно создавать сущности? Ваши сущности будут такими же, как всегда, только без аннотаций.

emix 24.10.2018 09:30

извините, это может показаться глупым. Но разве эта сущность не обязательна на пути разработки? Сущность содержит свойства таблицы, а также ссылочную переменную на другие таблицы, если таковые имеются. и это позволяет вам манипулировать ими как объектом. Я прав? Так что вопрос не в том, когда мне создавать сущность.

Nero 24.10.2018 09:35

У вас есть отношение к базе данных, мне лично база данных не нужна, потому что, если все основано на интерфейсах, база данных - это просто деталь реализации, но здесь не место для обсуждения этого. Если я помог, пожалуйста, подумайте о том, чтобы проголосовать за ответ и пометить его как решение. Удачи. Если вам интересно узнать об этом, прочтите больше о принципах SOLID и GRASP, шаблоне DDD, чистом коде и т. д.

emix 24.10.2018 09:41

это крутой emix для расширенной информации. Но вернемся к сущности, могу ли я предположить, что вы по какой-то причине не за то, чтобы доктрина обрабатывала автоматическое создание?

Nero 24.10.2018 09:53

Хорошо, это отклонение от темы. Я впервые слышу о модели анемической области. Насколько я понимаю, цель объекта сущности - предоставить слой для сопоставления столбцов таблицы со свойствами объекта. Это класс, который вы предоставили методу выборки подготовленного оператора при установке стиля выборки на PDO :: FETCH_CLASS или PDO :: FETCH_INTO. Для этого я сам считаю, что это должно быть просто, то есть Anemic, другими словами. Просто для тех, кому интересно, github.com/symfony/symfony-docs/issues/7460

Nero 24.10.2018 10:42

@emix знаете ли вы, есть ли способ избежать определения КАЖДОЙ сущности по очереди в части сопоставлений? Все мои orm.xml находятся в "config / doctrine". Ваш намек был бы мне очень полезен.

sdespont 09.12.2020 18:12

Другие вопросы по теме