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 => []
]
];
Обратите внимание:
- Поставщик
FromFilesSchemaProvider
загружает схему из PHP-файлов выражениемrequire
, что само по себе не безопасно. Храните файлы схемы в безопасном месте, ограниченном от потенциального воздействия пользователей. - Вы можете указать несколько файлов схемы, которые будут объединены в одну схему. При коллизии ролей будет брошено исключение.
- За счёт внутренних механизмов кеширования загрузка схемы из PHP-файла происходит настолько быстро, что вы можете не использовать внешние механизмы кеширования. Однако при загрузке нескольких файлов могут возникнуть накладные расходы на их объединение.
- Миграции на основе схемы из файла генерироваться не будут. Issue #25
- Поставщик работает только на чтение схемы. Это значит, что он не сотрёт файл после применения миграции и
не перезапишет в него новую схему, как это делает
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 переносите схему в файл.
В отличие от FromFilesSchemaProvider
, поставщик Cycle\Schema\Provider\PhpFileSchemaProvider
работает только с одним
файлом. Но схему он может не только читать, но и записывать.
В режиме чтения и записи файла схемы, поставщик PhpFileSchemaProvider
работает аналогично кешу. В режиме только записи
схема из поставщика, следующего за PhpFileSchemaProvider
, только записывается в файл.