




Представьте себе доменный объект 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>
Удачи.
Я никогда этого не делаю. Я придерживаюсь принципа «превыше всего». Я выполняю сопоставление после того, как модель предметной области будет завершена и покрыта модульными тестами.
Вы имеете в виду, что создаете файл объекта вручную? Я пришел из Symfony 3, и теперь у меня нет идей по этому поводу. Я нашел thinktocode.com/2018/04/19/doctrine-xml-mapping-or-annotatio ns, но он не упоминает подробностей о том, как сгенерировать сущность.
Верно. Зачем вообще нужно создавать сущности? Ваши сущности будут такими же, как всегда, только без аннотаций.
извините, это может показаться глупым. Но разве эта сущность не обязательна на пути разработки? Сущность содержит свойства таблицы, а также ссылочную переменную на другие таблицы, если таковые имеются. и это позволяет вам манипулировать ими как объектом. Я прав? Так что вопрос не в том, когда мне создавать сущность.
У вас есть отношение к базе данных, мне лично база данных не нужна, потому что, если все основано на интерфейсах, база данных - это просто деталь реализации, но здесь не место для обсуждения этого. Если я помог, пожалуйста, подумайте о том, чтобы проголосовать за ответ и пометить его как решение. Удачи. Если вам интересно узнать об этом, прочтите больше о принципах SOLID и GRASP, шаблоне DDD, чистом коде и т. д.
это крутой emix для расширенной информации. Но вернемся к сущности, могу ли я предположить, что вы по какой-то причине не за то, чтобы доктрина обрабатывала автоматическое создание?
Хорошо, это отклонение от темы. Я впервые слышу о модели анемической области. Насколько я понимаю, цель объекта сущности - предоставить слой для сопоставления столбцов таблицы со свойствами объекта. Это класс, который вы предоставили методу выборки подготовленного оператора при установке стиля выборки на PDO :: FETCH_CLASS или PDO :: FETCH_INTO. Для этого я сам считаю, что это должно быть просто, то есть Anemic, другими словами. Просто для тех, кому интересно, github.com/symfony/symfony-docs/issues/7460
@emix знаете ли вы, есть ли способ избежать определения КАЖДОЙ сущности по очереди в части сопоставлений? Все мои orm.xml находятся в "config / doctrine". Ваш намек был бы мне очень полезен.
Спасибо, emix. Какую команду вы использовали для создания объекта после создания сопоставления xml. например make: entity или doctrine: generate: entity?