Аннотации классов

Большинство методов объекта и коллекции в ORM — виртуальные. Это значит, что их не существует в коде класса, но PHP создает их автоматически через магический метод __call при обращении к несуществующим методам.

Система аннотаций в Bitrix Framework помогает IDE понимать доступные методы и показывать подсказки для автодополнения.

Аннотации ORM-классов ядра

Файл с аннотациями ORM-классов ядра находится по пути /bitrix/modules/main/meta/orm.php. Этот файл содержит множество объявлений классов с блоками аннотаций в phpDoc.

/* ORMENTITYANNOTATION:Bitrix\Main\UserTable:main/lib/UserTable.php */
        namespace Bitrix\Main {
            /**
             * EO_User
             * @see \Bitrix\Main\UserTable
             *
             * Custom methods:
             * ———————-
             *
             * @method \int getId()
             * @method \Bitrix\Main\EO_User setId(\int|\Bitrix\Main\DB\SqlExpression $id)
             * ...
             *
             * Common methods:
             * ———————-
             *
             * @property-read \Bitrix\Main\ORM\Entity $entity
             * ...
             * @method mixed get($fieldName)
             * ...
             */
            class EO_User extends \Bitrix\Main\ORM\Objectify\EntityObject {
                /* @var \Bitrix\Main\UserTable */
                static public $dataClass = '\Bitrix\Main\UserTable';
                /**
                 * @param bool|array $setDefaultValues
                 */
                public function __construct($setDefaultValues = true) {}
            }
        }
        

Фрагмент выше показывает описание класса EO_User — наследника стандартного EntityObject. ORM возвращает объекты этого типа при получении записей, а аннотации помогают IDE понять их структуру и доступные методы.

Для каждой таблицы, которая наследует Bitrix\Main\ORM\Data\DataManager, генерируется набор классов:

  • EO_User_Collection

  • EO_User_Query

  • EO_User_Result

  • EO_User_Entity

Эти классы можно использовать для указания типов аргументов и возвращаемых значений.

class MyClass
        {
            // ...
            
            private function getName(EO_User $user): string
            {
                return CUser::FormatName(
                    CSite::GetNameFormat(),
                    [
                        'NAME' => $user->getName(),
                        'LAST_NAME' => $user->getLastName(),
                        'SECOND_NAME' => $user->getSecondName(),
                    ],
                );
            }
        }
        

Аннотации для классов таблиц

Аннотации также добавляют phpDoc-блок перед классом таблицы.

//  Пример для UserTable
        /**
         * Class UserTable
         *
         * DO NOT WRITE ANYTHING BELOW THIS
         *
         * <<< ORMENTITYANNOTATION
         * @method static EO_User_Query query()
         * @method static EO_User_Result getByPrimary($primary, array $parameters = [])
         * @method static EO_User_Result getById($id)
         * @method static EO_User_Result getList(array $parameters = [])
         * @method static EO_User_Entity getEntity()
         * @method static \Bitrix\Main\EO_User createObject($setDefaultValues = true)
         * @method static \Bitrix\Main\EO_User_Collection createCollection()
         * @method static \Bitrix\Main\EO_User wakeUpObject($row)
         * @method static \Bitrix\Main\EO_User_Collection wakeUpCollection($rows)
         */
        class UserTable extends DataManager
        {
            // ...
        }
        

Эти аннотации позволяют IDE подсказывать методы для работы с сущностью: построение запросов, получение данных, создание объектов и коллекций.

Создать аннотации

Чтобы создать аннотации, нужно перейти в папку /bitrix/ проекта и использовать CLI-команду orm:annotate.

cd bitrix
        php bitrix.php orm:annotate
        

Перед использованием CLI-команд необходимо установить зависимости проекта через composer.

Как работает команда

Система сканирует файлы в папках /bitrix/modules/[module]/lib. Когда она находит класс Table, унаследованный от Bitrix\Main\ORM\Data\DataManager, то анализирует его карту полей — массив, который описывает структуру таблицы базы данных.

Результат работы — файл /bitrix/modules/orm_annotations.php. Файл содержит описания классов объекта и коллекции сущностей, а также вспомогательные классы для автодополнения.

При изменении карты полей в классе Table нужно сгенерировать аннотации снова, чтобы IDE отображала актуальные поля и методы.

Настроить сканирование модулей

По умолчанию команда сканирует только Главный модуль main. Указать другие модули можно с помощью ключа -m.

# Один модуль
        php bitrix.php orm:annotate -m tasks
        
        # Несколько модулей, перечисляйте через запятую
        php bitrix.php orm:annotate -m main,intranet
        
        # Все модули
        php bitrix.php orm:annotate -m all
        

Управлять аннотациями

Система обновляет аннотации выборочно. При повторном запуске команды перезаписываются только аннотации для указанных модулей. Аннотации остальных модулей сохраняются без изменений.

Чтобы полностью сбросить все аннотации, используйте ключ -c.

php bitrix.php orm:annotate -c -m all
        

Получить справку по команде

Посмотреть все параметры команды можно с помощью help.

php bitrix.php help orm:annotate