Doctrine / Symfony - принудительное действительное состояние объекта

Я создаю свой первый более крупный проект, используя доктрину, которую сейчас люблю и ненавижу!

Вот что я не понимаю: Почему это нормально, если сущность находится в недействительном состоянии?

Я имею в виду, конечно, вы можете использовать валидатор, чтобы проверить, действительна ли сущность (например, до сохранения), но не было бы лучше, если бы просто невозможно было даже находиться в недопустимом состоянии?

class Author
{
    /**
     * @Assert\NotBlank
     */
    public $name;
}

ИМХО не должно быть возможности делать:

$author = new Author();

так как это приводит к недопустимой сущности. Да, вы могли бы это сделать:

class Author
{
    /**
     * @Assert\NotBlank
     * @var string
     */
    public $name;

    public function __construct( string  $name )
    {
        $this->setName($name);
    }


    /**
     * @param string $name
     * @throws \Exception
     */
    public function setName(string $name)
    {
        if ($name ==''){
            throw new \Exception('name must be set');
        }        
        $this->name = $name;
    }

}

Но тогда для чего нужно это утверждение, верно?

Итак, я что-то здесь упускаю, или это просто так?

чтобы было ясно, это не имеет ничего общего с проверкой формы

minychillo 20.12.2018 10:57

Действительное состояние? Что такое действительное состояние? Когда это состояние следует проверять?

u_mulder 20.12.2018 11:02

В этом случае сущность действительна, только если имя не пустое (@Assert \ NotBlank), нет?

minychillo 20.12.2018 11:19
Что и что еще важнее когда будет проверять сущность? Каждый раз, когда сущность менялась?
u_mulder 20.12.2018 11:23

Нет, фактически ПЕРЕД изменением, поскольку от "изменения" следует отказаться, если объект окажется в недопустимом состоянии после изменений.

minychillo 20.12.2018 11:26

Итак, как вы собираетесь проверить $author->setName('')? Что, если у вас в сценарии 20 авторов? Что-то должен проверять эти сущности, и, в конце концов, вы не сохраняете их в базе данных. В чем тогда смысл?

u_mulder 20.12.2018 11:27

Что ж, в моем примере я это делаю, так как перед установкой свойства выполняется проверка, но при этом не используется компонент валидатора Symfony. Так что это можно сделать ..

minychillo 20.12.2018 11:31

IMHO не должно иметь значения, сохраняется ли объект или нет, чтобы быть уверенным, что он находится в допустимом состоянии.

minychillo 20.12.2018 11:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
133
1

Ответы 1

О Боже. Я об этом говорил. Жаль, что это был На французском!

Неважно, я полностью с вами согласен и не вижу ничего плохого в том, чтобы генерировать исключения, если ваши входные данные не подходят для объекта.

Кроме того, для меня Doctrine не имеет ограничений на такое использование. Фактически анемические модели были задокументированы в официальной документации Doctrine. Так что да, не очевидно, что Doctrine поддерживает неанемическую модель. Но благодаря отличные участники времена меняются.

Я бы хотел «решить» вашу проблему, но не вижу. Надеюсь, я дал то, что вы ожидали.

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