Skip to content

Commit

Permalink
Add cycle/schema-provider package (#186)
Browse files Browse the repository at this point in the history
  • Loading branch information
msmakouz authored Feb 12, 2024
1 parent cb103f0 commit 814dede
Show file tree
Hide file tree
Showing 54 changed files with 151 additions and 2,066 deletions.
2 changes: 2 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"cycle/schema-migrations-generator": "^2.0",
"cycle/schema-renderer": "^1.2",
"cycle/schema-builder": "^2.7",
"cycle/schema-provider": "^1.0",
"psr/event-dispatcher": "^1.0",
"psr/simple-cache": "^2.0|^3.0",
"spiral/attributes": "^2.7|^3.0",
Expand All @@ -44,6 +45,7 @@
"roave/infection-static-analysis-plugin": "^1.25",
"spatie/phpunit-watcher": "^1.23",
"vimeo/psalm": "^4.30|^5.7",
"yiisoft/definitions": "^3.2",
"yiisoft/test-support": "^3.0"
},
"autoload": {
Expand Down
24 changes: 22 additions & 2 deletions config/di.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,23 @@
use Cycle\ORM\ORMInterface;
use Cycle\ORM\Schema;
use Cycle\ORM\SchemaInterface;
use Cycle\Schema\Provider\FromFilesSchemaProvider;
use Cycle\Schema\Provider\PhpFileSchemaProvider;
use Cycle\Schema\Provider\SchemaProviderInterface;
use Cycle\Schema\Provider\Support\SchemaProviderPipeline;
use Psr\Container\ContainerInterface;
use Spiral\Core\FactoryInterface as SpiralFactoryInterface;
use Spiral\Files\FilesInterface;
use Yiisoft\Aliases\Aliases;
use Yiisoft\Definitions\DynamicReference;
use Yiisoft\Definitions\Reference;
use Yiisoft\Yii\Cycle\Exception\SchemaWasNotProvidedException;
use Yiisoft\Yii\Cycle\Factory\CycleDynamicFactory;
use Yiisoft\Yii\Cycle\Factory\DbalFactory;
use Yiisoft\Yii\Cycle\Factory\OrmFactory;
use Yiisoft\Yii\Cycle\Schema\Conveyor\CompositeSchemaConveyor;
use Yiisoft\Yii\Cycle\Schema\Conveyor\MetadataSchemaConveyor;
use Yiisoft\Yii\Cycle\Schema\Provider\Support\SchemaProviderPipeline;
use Yiisoft\Yii\Cycle\Schema\SchemaConveyorInterface;
use Yiisoft\Yii\Cycle\Schema\SchemaProviderInterface;

/**
* @var array $params
Expand Down Expand Up @@ -71,6 +76,21 @@
return (new SchemaProviderPipeline($container))->withConfig($params['yiisoft/yii-cycle']['schema-providers']);
},

// FromFilesSchemaProvider
FromFilesSchemaProvider::class => static function (Aliases $aliases) {
return new FromFilesSchemaProvider(static fn (string $path): string => $aliases->get($path));
},

// PhpFileSchemaProvider
PhpFileSchemaProvider::class => [
'__construct()' => [
DynamicReference::to(
static fn (Aliases $aliases): \Closure => static fn (string $path): string => $aliases->get($path)
),
Reference::optional(FilesInterface::class),
],
],

// Schema Conveyor
SchemaConveyorInterface::class => static function (ContainerInterface $container) use (&$params) {
/** @var SchemaConveyorInterface $conveyor */
Expand Down
5 changes: 3 additions & 2 deletions config/params.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

declare(strict_types=1);

use Cycle\Schema\Provider\SchemaProviderInterface;
use Cycle\Schema\Provider\Support\SchemaProviderPipeline;
use Yiisoft\Yii\Cycle\Command\Schema;
use Yiisoft\Yii\Cycle\Command\Migration;
use Yiisoft\Yii\Cycle\Schema\Conveyor\CompositeSchemaConveyor;
use Yiisoft\Yii\Cycle\Schema\SchemaProviderInterface;

return [
// Console commands
Expand Down Expand Up @@ -44,7 +45,7 @@
],

/**
* SchemaProvider list for {@see \Yiisoft\Yii\Cycle\Schema\Provider\Support\SchemaProviderPipeline}
* SchemaProvider list for {@see SchemaProviderPipeline}
* Array of classname and {@see SchemaProviderInterface} object.
* You can configure providers if you pass classname as key and parameters as array:
* [
Expand Down
24 changes: 12 additions & 12 deletions docs/en/reading-schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ Since a schema is built from an array of a certain structure, we can store it ei
You can display currently used schema by executing `cycle/schema` command.

In `yii-cycle` package schema can be built from multiple sources represented by multiple providers implementing
`SchemaProviderInterface`.
`Cycle\Schema\Provider\SchemaProviderInterface`.

In order to use multiple schema providers in turn, grouping `SchemaProviderPipeline` provider is used.
You can configure this provider in `schema-providers` section of a `config/params.php` file.
In order to use multiple schema providers in turn, grouping `Cycle\Schema\Provider\Support\SchemaProviderPipeline`
provider is used. You can configure this provider in `schema-providers` section of a `config/params.php` file.
Arrage schema providers in such an order, that caching providers are at the top of the list,
and origin schema providers at the end.

Expand All @@ -30,22 +30,22 @@ using annotations it is a good idea to use schema cache.

## Schema cache

Reading and writing a schema from and to cache happens in `SimpleCacheSchemaProvider`.
Reading and writing a schema from and to cache happens in `Cycle\Schema\Provider\SimpleCacheSchemaProvider`.

Place it to the beginning of providers list to make the process of obtaining a schema significantly faster.

## File-based schema

If you want to avoid annotations, you can describe a schema in a PHP file.
Use `FromFilesSchemaProvider` to load a schema:
Use `Cycle\Schema\Provider\FromFilesSchemaProvider` to load a schema:

```php
# config/common.php
[
'yiisoft/yii-cycle' => [
// ...
'schema-providers' => [
\Yiisoft\Yii\Cycle\Schema\Provider\FromFilesSchemaProvider::class => [
\Cycle\Schema\Provider\FromFilesSchemaProvider::class => [
'files' => '@runtime/schema.php'
]
],
Expand Down Expand Up @@ -88,7 +88,7 @@ But in case of loading multiple files, it may take extra time to merge them.

## Building DB schema from different providers

To merge schema parts obtained from different providers, use `MergeSchemaProvider`.
To merge schema parts obtained from different providers, use `Cycle\Schema\Provider\MergeSchemaProvider`.

```php
# runtime/schema.php
Expand All @@ -97,11 +97,11 @@ return [
'yiisoft/yii-cycle' => [
// ...
'schema-providers' => [
\Yiisoft\Yii\Cycle\Schema\Provider\Support\MergeSchemaProvider::class => [
\Cycle\Schema\Provider\MergeSchemaProvider::class => [
// You can specify the provider class as the key and the configuration as the value.
\Yiisoft\Yii\Cycle\Schema\Provider\FromFilesSchemaProvider::class => ['files' => ['@src/schema.php']],
\Cycle\Schema\Provider\FromFilesSchemaProvider::class => ['files' => ['@src/schema.php']],
// The provider and its configuration can be passed as an array.
[\Yiisoft\Yii\Cycle\Schema\Provider\SimpleCacheSchemaProvider::class, ['key' => 'cycle-schema']],
[\Cycle\Schema\Provider\SimpleCacheSchemaProvider::class, ['key' => 'cycle-schema']],
// When defining the dependency as a string, make sure the container provides
// the already configured provider.
\Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider::class,
Expand Down Expand Up @@ -132,8 +132,8 @@ migrations based on them. For production use schema could be moved into a file.

### `PhpFileSchemaProvider` Provider

Unlike `FromFilesSchemaProvider`, the `PhpFileSchemaProvider` works with only one file. but, `PhpFileSchemaProvider`
can not only read schema, but also save it.
Unlike `FromFilesSchemaProvider`, the `Cycle\Schema\Provider\PhpFileSchemaProvider` works with only one file. but,
`PhpFileSchemaProvider` can not only read schema, but also save it.

In the mode of reading and writing a schema file, the `PhpFileSchemaProvider` provider works similarly to the cache, with
the only difference is that saved result (schema file), can be saved in codebase.
24 changes: 12 additions & 12 deletions docs/es/reading-schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ Dado que el esquema se construye a partir de un arreglo con una estructura defin
Puede mostrar el esquema utilizado actualmente ejecutando el comando `cycle/schema`.

En el paquete `yiisoft/yii-cycle` el esquema puede ser construido desde múltiples fuentes representadas por múltiples proveedores que implementan
`SchemaProviderInterface`.
`Cycle\Schema\Provider\SchemaProviderInterface`.

Para utilizar varios proveedores de esquemas, se utiliza el proveedor `SchemaProviderPipeline` de agrupación.
Puede configurar este proveedor en la sección `schema-providers` en el archivo `config/params.php`.
Para utilizar varios proveedores de esquemas, se utiliza el proveedor `Cycle\Schema\Provider\Support\SchemaProviderPipeline`
de agrupación. Puede configurar este proveedor en la sección `schema-providers` en el archivo `config/params.php`.
Los proveedores de esquemas deben estar organizados de la siguiente manera, los proveedores de caché deben estar al principio de la lista y los proveedores de esquemas de origen al final.


Expand All @@ -29,22 +29,22 @@ usar anotaciones es una buena idea usar el caché de esquemas.

## Esquemas desde caché

La lectura y escritura de un esquema desde y hacia la caché ocurre en `SimpleCacheSchemaProvider`.
La lectura y escritura de un esquema desde y hacia la caché ocurre en `Cycle\Schema\Provider\SimpleCacheSchemaProvider`.

Debe indicarse al principio de la lista de proveedores para que el proceso de obtención de un esquema sea significativamente más rápido.

## Esquemas basados en archivos

Si quiere evitar las anotaciones, puede describir un esquema en un archivo PHP.
Utilice `FromFilesSchemaProvider` para cargar un esquema:
Utilice `Cycle\Schema\Provider\FromFilesSchemaProvider` para cargar un esquema:

```php
# config/common.php
[
'yiisoft/yii-cycle' => [
// ...
'schema-providers' => [
\Yiisoft\Yii\Cycle\Schema\Provider\FromFilesSchemaProvider::class => [
\Cycle\Schema\Provider\FromFilesSchemaProvider::class => [
'files' => '@runtime/schema.php'
]
],
Expand Down Expand Up @@ -87,7 +87,7 @@ En el caso de que se carguen varios archivos, puede tardar más tiempo en fusion

## Construir el esquema de la base de datos a partir de diferentes proveedores

Para fusionar partes del esquema obtenidas de diferentes proveedores, utilice `MergeSchemaProvider`.
Para fusionar partes del esquema obtenidas de diferentes proveedores, utilice `Cycle\Schema\Provider\MergeSchemaProvider`.

```php
# runtime/schema.php
Expand All @@ -96,11 +96,11 @@ return [
'yiisoft/yii-cycle' => [
// ...
'schema-providers' => [
\Yiisoft\Yii\Cycle\Schema\Provider\Support\MergeSchemaProvider::class => [
\Cycle\Schema\Provider\MergeSchemaProvider::class => [
// Puede especificar la clase de proveedor como clave y la configuración como valor.
\Yiisoft\Yii\Cycle\Schema\Provider\FromFilesSchemaProvider::class => ['files' => ['@src/schema.php']],
\Cycle\Schema\Provider\FromFilesSchemaProvider::class => ['files' => ['@src/schema.php']],
// El proveedor y su configuración pueden pasarse como un array.
[\Yiisoft\Yii\Cycle\Schema\Provider\SimpleCacheSchemaProvider::class, ['key' => 'cycle-schema']],
[\Cycle\Schema\Provider\SimpleCacheSchemaProvider::class, ['key' => 'cycle-schema']],
// Al definir la dependencia como una cadena, asegúrese de que el contenedor proporciona
// el proveedor ya configurado.
\Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider::class,
Expand Down Expand Up @@ -130,8 +130,8 @@ migraciones basadas en ellas. Para el uso en producción, el esquema puede ser t

### Provider `PhpFileSchemaProvider`

A diferencia de `FromFilesSchemaProvider`, el archivo `PhpFileSchemaProvider` trabaja con un solo archivo de esquema `PhpFileSchemaProvider`
no sólo puede leer el esquema, sino también guardarlo.
A diferencia de `FromFilesSchemaProvider`, el archivo `Cycle\Schema\Provider\PhpFileSchemaProvider` trabaja con un solo
archivo de esquema `PhpFileSchemaProvider` no sólo puede leer el esquema, sino también guardarlo.

En el modo de lectura y escritura un archivo de esquema que utilice el proveedor `PhpFileSchemaProvider`, funcionara de forma similar a la caché, con
la única diferencia que el resultado guardado (archivo de esquema), puede ser guardado en codebase.
26 changes: 13 additions & 13 deletions docs/ru/reading-schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ Cycle ORM в своей работе полагается на схему — о
Посмотреть используемую в вашем проекте схему вы можете с помощью консольной команды `cycle/schema`.

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

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

## Схема из аннотаций сущностей

Expand All @@ -30,14 +30,14 @@ Cycle ORM в своей работе полагается на схему — о

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

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

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

## Схема в файле

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

```php
# Файл config/common.php
Expand All @@ -46,7 +46,7 @@ return [
'yiisoft/yii-cycle' => [
// ...
'schema-providers' => [
\Yiisoft\Yii\Cycle\Schema\Provider\FromFilesSchemaProvider::class => [
\Cycle\Schema\Provider\FromFilesSchemaProvider::class => [
'files' => ['@runtime/schema.php']
]
],
Expand Down Expand Up @@ -91,7 +91,7 @@ return [

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

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

```php
# Файл config/common.php
Expand All @@ -100,11 +100,11 @@ return [
'yiisoft/yii-cycle' => [
// ...
'schema-providers' => [
\Yiisoft\Yii\Cycle\Schema\Provider\Support\MergeSchemaProvider::class => [
\Cycle\Schema\Provider\MergeSchemaProvider::class => [
// Вы можете указать класс поставщика в качестве ключа, а конфигурацию в качестве значения.
\Yiisoft\Yii\Cycle\Schema\Provider\FromFilesSchemaProvider::class => ['files' => ['@src/schema.php']],
\Cycle\Schema\Provider\FromFilesSchemaProvider::class => ['files' => ['@src/schema.php']],
// Поставщик и его конфигурация могут быть переданы в виде массива.
[\Yiisoft\Yii\Cycle\Schema\Provider\SimpleCacheSchemaProvider::class, ['key' => 'cycle-schema']],
[\Cycle\Schema\Provider\SimpleCacheSchemaProvider::class, ['key' => 'cycle-schema']],
// При указании зависимости в виде строки убедитесь, что контейнер предоставит
// уже сконфигурированного поставщика.
\Yiisoft\Yii\Cycle\Schema\Provider\FromConveyorSchemaProvider::class,
Expand Down Expand Up @@ -136,8 +136,8 @@ cycle/schema/php @runtime/schema.php

### Поставщик PhpFileSchemaProvider

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

В режиме чтения и записи файла схемы, поставщик `PhpFileSchemaProvider` работает аналогично кешу. В режиме только записи
схема из поставщика, следующего за `PhpFileSchemaProvider`, только записывается в файл.
2 changes: 1 addition & 1 deletion src/Command/CycleDependencyProxy.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
use Cycle\Migrations\Migrator;
use Cycle\ORM\ORMInterface;
use Cycle\ORM\SchemaInterface;
use Cycle\Schema\Provider\SchemaProviderInterface;
use Psr\Container\ContainerInterface;
use Yiisoft\Yii\Cycle\Schema\SchemaConveyorInterface;
use Yiisoft\Yii\Cycle\Schema\SchemaProviderInterface;

final class CycleDependencyProxy
{
Expand Down
48 changes: 0 additions & 48 deletions src/Exception/CumulativeException.php

This file was deleted.

Loading

0 comments on commit 814dede

Please sign in to comment.