Skip to content

Latest commit

 

History

History
146 lines (113 loc) · 9.39 KB

reading-schema.md

File metadata and controls

146 lines (113 loc) · 9.39 KB

Чтение схемы данных

Cycle ORM в своей работе полагается на схему — объект, реализующий интерфейс \Cycle\ORM\SchemaInterface.

Поскольку исходные данные для схемы представляют собой массив определённой структуры, мы можем хранить схему в кеше или в файле текстового формата.

Посмотреть используемую в вашем проекте схему вы можете с помощью консольной команды cycle/schema.

В пакете yii-cycle схему из разных источников предоставляют разные поставщики, реализующие интерфейс Cycle\Schema\Provider\SchemaProviderInterface.

Для того, чтобы последовательно использовать несколько поставщиков схемы, используется группирующий поставщик Cycle\Schema\Provider\Support\SchemaProviderPipeline, который можно сконфигурировать в секции schema-providers файла config/params.php. Выстраивайте поставщиков схемы в таком порядке, чтобы кеширующие поставщики были в начале списка, а первичные источники схемы в конце.

Схема из атрибутов сущностей

По умолчанию схема собирается на основе атрибутов сущностей вашего проекта.

В процессе сборки схемы последовательно запускаются генераторы. Очерёдность запуска определяется в объекте, реализующем интерфейс SchemaConveyorInterface. Вы можете внедрить свои генераторы в конвейер, определив их в опции entity-paths файла config/params.php.

Для получения схемы из конвейера используется провайдер FromConveyorSchemaProvider.

Процесс сборки схемы на основе атрибутов относительно ресурсоёмкий и может значительно влиять на производительность приложения. Поэтому вкупе с атрибутами рекомендуется настроить кеширование схемы.

Кеширование схемы

Запись и чтение схемы в кеш осуществляет поставщик Cycle\Schema\Provider\SimpleCacheSchemaProvider.

Разместите его в начале списка поставщиков, чтобы значительно ускорить процесс получения схемы.

Схема в файле

Если вы желаете избежать использования атрибутов для описания схемы, то можно описать её в PHP-файле. Воспользуйтесь поставщиком Cycle\Schema\Provider\FromFilesSchemaProvider для загрузки схемы из PHP-файла:

# Файл config/common.php
use Cycle\Schema\Provider\FromFilesSchemaProvider;

return [
    // ...
    'yiisoft/yii-cycle' => [
        // ...
        'schema-providers' => [
            FromFilesSchemaProvider::class => FromFilesSchemaProvider::config(fiels: ['@runtime/schema.php']),
        ],
    ]
];
# Файл runtime/schema.php
use Cycle\ORM\Schema;
return [
   'user' => [
        Schema::MAPPER      => \Cycle\ORM\Mapper\Mapper::class,
        Schema::ENTITY      => \App\Entity\User::class,
        Schema::DATABASE    => 'default',
        Schema::TABLE       => 'users',
        Schema::PRIMARY_KEY => 'id',
        Schema::COLUMNS     => [
           'id'   => 'id',
           'name' => 'name'
        ],
        Schema::TYPECAST    => [
           'id' => 'int'
        ],
        Schema::RELATIONS   => []
    ]
];

Обратите внимание:

  1. Поставщик FromFilesSchemaProvider загружает схему из PHP-файлов выражением require, что само по себе не безопасно. Храните файлы схемы в безопасном месте, ограниченном от потенциального воздействия пользователей.
  2. Вы можете указать несколько файлов схемы, которые будут объединены в одну схему. При коллизии ролей будет брошено исключение.
  3. За счёт внутренних механизмов кеширования загрузка схемы из PHP-файла происходит настолько быстро, что вы можете не использовать внешние механизмы кеширования. Однако при загрузке нескольких файлов могут возникнуть накладные расходы на их объединение.
  4. Миграции на основе схемы из файла генерироваться не будут. Issue #25
  5. Поставщик работает только на чтение схемы. Это значит, что он не сотрёт файл после применения миграции и не перезапишет в него новую схему, как это делает SimpleCacheSchemaProvider.

Сборка схемы по частям из разных поставщиков

Для того, чтобы объединить получаемые из разных поставщиков части схемы в одну, используйте Cycle\Schema\Provider\MergeSchemaProvider.

# Файл config/common.php
return [
    // ...
    'yiisoft/yii-cycle' => [
        // ...
        'schema-providers' => [
            \Cycle\Schema\Provider\MergeSchemaProvider::class => [
                // Вы можете указать класс поставщика в качестве ключа, а конфигурацию в качестве значения.
                // В большинстве случаев готовый массив конфигурации можно получить через статический
                // метод `config()` класса поставщика. В этом случае будут доступны подсказки в IDE.
                \Cycle\Schema\Provider\FromFilesSchemaProvider::class => ['files' => ['@src/schema.php']],
                // Если вам нужно использовать несколько одноименных поставщиков схемы,
                // поставщик и его конфигурация могут быть переданы в виде массива из двух элементов.
                [\Cycle\Schema\Provider\SimpleCacheSchemaProvider::class, ['key' => 'cycle-schema']],
                // При указании зависимости в виде строки убедитесь, что контейнер предоставит
                // уже сконфигурированного поставщика.
                \Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider::class,
            ]
        ],
    ]
];

Перенос схемы из атрибутов в файл

Консольная команда

Для экспорта схемы в виде PHP можно воспользоваться консольной командой cycle/schema/php. Укажите первым параметром имя файла и схема запишется в него:

cycle/schema/php @runtime/schema.php

Псевдоним @runtime автоматически раскроется в соответствующее значение и схема запишется в указанный файл schema.php.

Убедитесь, что экспортированная схема не содержит ошибок, а затем назначьте на предоставление схемы из файла поставщика FromFilesSchemaProvider.

Вы можете комбинировать оба способа описания схемы: при разработке используйте аннотации и генерируйте на их основе миграции; для production переносите схему в файл.

Поставщик PhpFileSchemaProvider

В отличие от FromFilesSchemaProvider, поставщик Cycle\Schema\Provider\PhpFileSchemaProvider работает только с одним файлом. Но схему он может не только читать, но и записывать.

В режиме чтения и записи файла схемы, поставщик PhpFileSchemaProvider работает аналогично кешу. В режиме только записи схема из поставщика, следующего за PhpFileSchemaProvider, только записывается в файл.