Doctrine 2 ORM создает классы с ненавистным CamelCase

Я создал конфигурацию yaml для Doctrine. Когда я пытаюсь doctrine orm:generate-entities, он создает файлы php с геттерами и сеттерами в случае верблюда. Итак, поле is_public трансформируется в методы setIsPublic и getIsPublic. Это ужасно. Как я могу получить set_is_public и get_is_public? Я могу вручную редактировать сгенерированные файлы php, но я не знаю, что произойдет, когда я изменю схему.


person Pavel Strakhov    schedule 27.09.2011    source источник
comment
Я должен согласиться, что у вас необычное мнение об именах методов. Учитывая, что ваша платформа (PHP) сама использует имена методов в верблюжьем стиле для встроенных объектов, вы определенно идете против течения. Тем не менее, это интересный вопрос, поэтому я проголосовал за него (отменив некоторые другие ненавистные отрицательные голоса)   -  person timdev    schedule 28.09.2011


Ответы (3)


Вы можете выбрать стратегию именования. который Doctrine будет использовать для создания элементов, используя:

Используя стратегию именования, вы можете предоставить правила для автоматического создания идентификаторов базы данных, имен столбцов и таблиц, когда имя таблицы/столбца не задано. Эта функция помогает уменьшить объем детализации документа сопоставления, устраняя повторяющийся шум (например, TABLE_).

Для вашего конкретного случая, я думаю, вы смотрите на что-то вроде:

$namingStrategy = new \Doctrine\ORM\Mapping\UnderscoreNamingStrategy(CASE_LOWER);
$configuration()->setNamingStrategy($namingStrategy);

Связанная тема продолжает показывать вам, как вы можете написать свою собственную стратегию именования.

Если вы используете Symfony, это даже проще (как и большинство вещей с Symfony, но это только мое мнение) через config.yml:

doctrine:
    orm:
        naming_strategy: doctrine.orm.naming_strategy.underscore
person aalaap    schedule 28.07.2016
comment
Возможно, вам следует добавить … использование символов подчеркивания потребует дополнительного параметра name="user_id" в вашем @ORM\Column annotation - person A.L; 28.07.2016
comment
Насколько я понимаю, указание Doctrine на использование определенной стратегии именования избавит вас от необходимости явно устанавливать связь имени переменной с именем столбца самостоятельно. Doctrine знает, что делать теперь, когда вы сказали это. - person aalaap; 28.07.2016
comment
Я думаю, что было бы интересно предоставить альтернативную аннотацию @ORM\Column, которую можно было бы использовать только при необходимости, без изменения глобальной стратегии именования. - person A.L; 28.07.2016

стандарты кодирования Symfony призывают пользователей Symfony использовать верблюжий регистр:

Соглашения об именах

Используйте camelCase, а не символы подчеркивания, для имен переменных, функций и методов, аргументов.

person A.L    schedule 07.11.2013
comment
Это не стандартное правило кодирования Doctrine — это правило Symfony. Doctrine, похоже, не применяет конкретный регистр для имен переменных, но, учитывая, что это в конечном счете PHP, верблюжий регистр - хорошая ставка. Обратите внимание, что использование верблюжьего регистра, когда в именах столбцов вашей таблицы используются символы подчеркивания, потребует дополнительного параметра name="user_id" в вашей аннотации @ORM\Column. - person aalaap; 28.07.2016
comment
@aalaap Спасибо, я не знаю, почему я написал, что это была доктрина, тогда как я процитировал и связал документацию Symfony. Я обновлю свой ответ. - person A.L; 28.07.2016
comment
@aalaap Не стесняйтесь добавлять свой ответ того же содержания, что и ваш комментарий. Мой ответ не по теме. - person A.L; 28.07.2016
comment
Я сделал. Жаль, что ОП, вероятно, никогда этого не увидит. - person aalaap; 28.07.2016

Личный совет - не генерируйте сущности по доктрине orm:generate-entities.
Используйте простой PHP для создания класса. Почему?
Orm использует рефлексию приватных для связи с базой данных. Вам не нужно генерировать сеттеры и геттеры. Я рекомендую вам использовать шаблоны проектирования, такие как фабрика или конструктор, для достижения вашей цели. Декораторы также должны работать нормально.

<?php

class MyClass
{
    private $id;
    private $name;

    public function __construct(int $id, string $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}


$camelCase — это не только рекомендация Symfony для стандарта кода. Он основан на PSR2. Я настоятельно рекомендую использовать PSR2, код становится чистым и стандартизированным.
Стандартная стратегия именования ORM — это $camelCase частная переменная в имя столбца snake_case. Если вы хотите изменить его иначе, подумайте: другие стратегии именования

person Błażej Krzakala    schedule 13.06.2018