Symfony Doctrine-columns traits

hell0w0rd

Продвинутый новичок
В общем из проекта вынес несколько трейтов, которые убраны в трейты из-за копипаста.
https://github.com/nkt/doctrine-columns
Может кому пригодится:)
Еще есть подобные репозитории у knp, по trait пакагистится
 

keltanas

marty cats
Точности достаточно )) Хорошо, зайдем с другой стороны http://martinfowler.com/eaaCatalog/money.html

Никогда не сталкивался, что
$val1 = 1.00
$val2 = getFromDB() // 1.00
$this->assetEquals($val1, $val2);
проваливается?

Или не приходилось делить копейки между 2 заказами?
 

hell0w0rd

Продвинутый новичок
Вурдалак, вот я тоже задумался на счет этого. Ща попробую) Но я всегда для name ставил varchar(255).
На самом деле - это больше призыв к тому, чтобы делать так в коде повсеместно. У меня популярные сущности вынесены в EntityInjectable и это невероятно удобно.

А по поводу CRUD - в симфони нельзя без сеттеров/геттеров, если хочешь использовать формы. А так да, логику стоит выносить в методы
 

keltanas

marty cats
Я в последнее время поддерживаю такое мнение: http://verraes.net/2013/04/crud-is-an-anti-pattern/
Я тоже в последнее время так пишу. Только больше придерживаюсь вида
PHP:
<?php
$customerService->pay($customer, $order, $money);
А сервис уже разруливает, у кого что взять, и куда что положить. Но, при этом мы можем задать в сервисе стратегию, которая так же может зависеть от других сервисов.

Но, такой подход не исключает наличие сеттеров/геттеров.
Да и вообще, Doctrine позволит задать, например, кастомный length для Column\Name?
Имеешь ввиду это?
http://docs.doctrine-project.org/en/2.1/reference/annotations-reference.html#column
 

keltanas

marty cats

keltanas

marty cats
Для одной сущности — 255, для другой — 42. Возможно?
В частном случае теряя в гибкости
Думаю, что нет. В этом недостаток данного подхода.
Но, например, createdAt и updatedAt вполне себе можно вместе с @HasLifecycleCallbacks использовать как трейты
Только надо дописать соответствующие обработчики (в трейтах)

upd: так вот же https://github.com/KnpLabs/DoctrineBehaviors#timestampable
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Вурдалак, не получится. И дело не в доктрине, а в php.
PHP:
<?php
//test.php
trait Foo
{
    /**
    * @var int
    */
    protected $id;

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

class Bar
{
    use Foo;
    /**
    * @ORM\Id
    */
    protected $id;
}

$refl = new ReflectionClass('Bar');
echo $refl->getProperty('id')->getDocComment(), PHP_EOL;
Код:
$ php test.php
PHP Strict standards:  Bar and Foo define the same property ($id) in the composition of Bar. This might be incompatible, to improve maintainability consider using accessor methods in traits instead. Class was composed in /Users/nkt/Desktop/test.php on line 23
PHP Stack trace:
PHP  1. {main}() /Users/nkt/Desktop/test.php:0

Strict standards: Bar and Foo define the same property ($id) in the composition of Bar. This might be incompatible, to improve maintainability consider using accessor methods in traits instead. Class was composed in /Users/nkt/Desktop/test.php on line 23

Call Stack:
    0.0002    233056  1. {main}() /Users/nkt/Desktop/test.php:0

/**
    * @ORM\Id
    */
Правда судя по всему это похоже на баг. В доке описано, что не меняя сигнатуру, можно заново определять свойство.
http://php.net/manual/ru/language.oop5.traits.php - 12 пример, прям перед комментами
ЗЫ а не, не баг. Написано же Stricts Standarts. Все равно, не приятное поведение:(
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Да, у них еще есть клевые трейты для контроллеров.
Здесь была задумка именно в выносе популяных свойств в трейты... Это очень удобно, потому что в модельке остаются только логические и совсем уникальные методы и из 300-400 строк, они уменьшаются до 100-150)
 

Absinthe

жожо
А зачем это? Геттеры и сеттеры создаются через Alt + Insert. Создавать по файлу ради выноса пары строк в аннотации в этот файл?
 

Вурдалак

Продвинутый новичок
hell0w0rd, так есть ещё YAML, XML, etc. Через аннотации я бы и не пробовал ) Но, по-моему, всё-таки нельзя. Ну, есть ограничения, да.
 

hell0w0rd

Продвинутый новичок
Вурдалак, а, ну так если ты не используешь аннотации - все описываешь в своем формате, а код просто используешь
Absinthe, за уменьшением кол-ва кода. У меня в модельке 16 простых полей и 7 связей. Это почти 700 строк геттеров и сеттеров и из них только 100-150 строчек логики. Убрав повторяющийся код в трейты - я просто экономлю себе время на просмотре кода
 

Вурдалак

Продвинутый новичок
Вурдалак, а, ну так если ты не используешь аннотации - все описываешь в своем формате, а код просто используешь
Так Doctrine не найдёт свойства в классе. Ты для трейта будешь отдельный YAML-файл делать, в этом смысле всё один в один.
 

hell0w0rd

Продвинутый новичок
Вурдалак, с чего бы вдруг не найдет? Доктрина смотрит не на реальный код, а на рефлексию. А рефлексия умная
 
Сверху