Когда вы инициализируете свой проект с помощью команды Init , Phinx создает файл по умолчанию в корне каталога вашего проекта. По умолчанию этот файл использует формат сериализации данных YAML, но вы можете использовать --format параметр командной строки , чтобы указать либо yaml, yml, jsonили php.

Если --configurationуказан параметр командной строки, Phinx загрузит указанный файл. В противном случае, он будет пытаться найти phinx.php, phinx.json, phinx.ymlили phinx.yamlи загрузить первый файл найден.

Не забудьте хранить файл конфигурации вне общедоступного каталога на вашем веб-сервере. Этот файл содержит учетные данные вашей базы данных и может быть случайно использован как обычный текст.

Обратите внимание , что в то время как JSON и YAML файлы разобраны , файл РНР включен . Это означает, что:

  • Он должен возвращать массив элементов конфигурации.
  • Область видимости переменной является локальной, т.е. вам нужно будет явно объявить любые глобальные переменные, которые ваш файл инициализации читает или изменяет.
  • Его стандартный вывод подавлен.
  • В отличие от JSON и YAML, можно опустить детали подключения к среде и вместо этого указать, connectionкакая из них должна содержать инициализированный экземпляр PDO. Это полезно, когда вы хотите, чтобы ваши миграции взаимодействовали с вашим приложением и / или использовали одно и то же соединение. Однако не забудьте также передать имя базы данных, поскольку Phinx не может вывести это из соединения PDO.
$app = require 'app/phinx.php';
$pdo = $app->getDatabase()->getPdo();

return [
    'environments' => [
        'default_environment' => 'development',
        'development' => [
            'name' => 'devdb',
            'connection' => $pdo
        ]
    ]
];

Пути миграции

Первый вариант указывает путь к вашему каталогу миграции. Phinx %%PHINX_CONFIG_DIR%%/db/migrationsпо умолчанию использует.

%%PHINX_CONFIG_DIR%% - это специальный токен, который автоматически заменяется корневым каталогом, в котором хранится ваш файл конфигурации phinx.

Чтобы перезаписать значение по умолчанию %%PHINX_CONFIG_DIR%%/db/migrations, вам необходимо добавить в конфигурацию следующее.

paths:
    migrations: /your/full/path

Вы также можете указать несколько путей миграции, используя массив в своей конфигурации:

paths:
    migrations:
        - application/module1/migrations
        - application/module2/migrations

Вы также можете использовать %%PHINX_CONFIG_DIR%%токен на своем пути.

paths:
    migrations: '%%PHINX_CONFIG_DIR%%/your/relative/path'

Миграции фиксируются с помощью glob, поэтому вы можете определить шаблон для нескольких каталогов.

paths:
    migrations: '%%PHINX_CONFIG_DIR%%/module/*/{data,scripts}/migrations'

База нестандартной миграции

По умолчанию все миграции производятся из класса AbstractMigration в Phinx . Это можно установить в настраиваемый класс, который расширяется от AbstractMigration , установив migration_base_classв вашей конфигурации:

migration_base_class: MyMagicalMigration

Paths seeds

Второй вариант указывает путь к вашему исходному каталогу. Phinx %%PHINX_CONFIG_DIR%%/db/seedsпо умолчанию использует.

%%PHINX_CONFIG_DIR%% - это специальный токен, который автоматически заменяется корневым каталогом, в котором хранится ваш файл конфигурации.

Чтобы перезаписать значение по умолчанию %%PHINX_CONFIG_DIR%%/db/seeds, вам необходимо добавить следующее в конфигурацию yaml.

paths:
    seeds: /your/full/path

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

paths:
    seeds:
        - /your/full/path1
        - /your/full/path2

Вы также можете использовать %%PHINX_CONFIG_DIR%%токен на своем пути.

paths:
    seeds: '%%PHINX_CONFIG_DIR%%/your/relative/path'

Специальная база сеялки

По умолчанию все сидеры будут производными от класса AbstractSeed Phinx . Это можно установить в настраиваемый класс, который расширяется от AbstractSeed , установив seeder_base_classв вашей конфигурации:

seeder_base_class: MyMagicalSeeder

Среды

Одна из ключевых особенностей Phinx - поддержка нескольких сред баз данных. Вы можете использовать Phinx для создания миграций в своей среде разработки, а затем запускать те же миграции в производственной среде. Среды указаны во environmentsвложенной коллекции. Например:

environments:
    default_migration_table: phinxlog
    default_environment: development
    production:
        adapter: mysql
        host: localhost
        name: production_db
        user: root
        pass: ''
        port: 3306
        charset: utf8
        collation: utf8_unicode_ci

определит новую среду под названием production.

В ситуации, когда несколько разработчиков работают над одним и тем же проектом и у каждого из них своя среда (например, соглашение ), или когда вам нужно иметь отдельные среды для разных целей (ветки, тестирование и т. Д.), Используйте переменную среды PHINX_ENVIRONMENT, чтобы переопределить окружение по умолчанию в файле yaml:--

export PHINX_ENVIRONMENT=dev-`whoami`-`hostname`

Таблица миграции

Чтобы отслеживать статусы миграции для среды, phinx создает таблицу для хранения этой информации. Вы можете настроить, где будет создаваться эта таблица, настроив default_migration_table:

environment:
    default_migration_table: phinxlog

Если это поле опущено, по умолчанию используется phinxlog. Для баз данных, которые его поддерживают, например Postgres, имя схемы может начинаться с разделителя точки ( .). Например, phinx.logсоздать таблицу logв phinxсхеме вместо phinxlogв public( по умолчанию) схеме.

Префикс и суффикс таблицы

Вы можете определить префикс таблицы и суффикс таблицы:

environments:
    development:
        ....
        table_prefix: dev_
        table_suffix: _v1
    testing:
        ....
        table_prefix: test_
        table_suffix: _v2

Socket Connections

При использовании адаптера MySQL также можно использовать сокеты вместо сетевых подключений. Путь к сокету настроен с помощью unix_socket:

environments:
    default_migration_table: phinxlog
    default_environment: development
    production:
        adapter: mysql
        name: production_db
        user: root
        pass: ''
        unix_socket: /var/run/mysql/mysql.sock
        charset: utf8

Внешние переменные

Phinx автоматически получит любую переменную среды с префиксом PHINX_ и сделает ее доступной в качестве токена в файле конфигурации. У токена будет точно такое же имя, что и у переменной, но вы должны получить к нему доступ, заключив два %%символа с каждой стороны. например: '%%PHINX_DBUSER%%'. Это особенно полезно, если вы хотите хранить учетные данные секретной базы данных непосредственно на сервере, а не в системе контроля версий. Эту возможность легко продемонстрировать на следующем примере:

environments:
    default_migration_table: phinxlog
    default_environment: development
    production:
        adapter: mysql
        host: '%%PHINX_DBHOST%%'
        name: '%%PHINX_DBNAME%%'
        user: '%%PHINX_DBUSER%%'
        pass: '%%PHINX_DBPASS%%'
        port: 3306
        charset: utf8

Имена источников данных

Phinx поддерживает использование имен источников данных (DSN) для указания параметров подключения, что может быть полезно, если вы используете одну переменную среды для хранения учетных данных базы данных. PDO имеет разные форматы DSN в зависимости от базового драйвера, поэтому Phinx использует формат DSN, не зависящий от базы данных, используемый другими проектами (Doctrine, Rails, AMQP, PaaS и т. Д.).

://[[:]@][:]/[?]

DSN требует как минимум adapter, hostи name.

Вы не можете указать пароль без имени пользователя.

port должно быть положительным целым числом.

additionalOptions принимает форму строки запроса и передается адаптеру в массиве параметров.

environments:
    default_migration_table: phinxlog
    default_environment: development
    production:
        # Example data source name
        dsn: mysql://root@localhost:3306/mydb?charset=utf8

После анализа DSN его значения объединяются с уже существующими параметрами подключения. Значения, указанные в DSN, никогда не переопределят любое значение, указанное непосредственно в качестве параметров подключения.

environments:
    default_migration_table: phinxlog
    default_environment: development
    development:
        dsn: %%DATABASE_URL%%
    production:
        dsn: %%DATABASE_URL%%
        name: production_database

Если предоставленный DSN недействителен, он полностью игнорируется.

Поддерживаемые адаптеры

В настоящее время Phinx изначально поддерживает следующие адаптеры баз данных:

  • MySQL : укажите mysqlадаптер.
  • PostgreSQL : укажите pgsqlадаптер.
  • SQLite : укажите sqliteадаптер.
  • SQL Server : укажите sqlsrvадаптер.

Для каждого адаптера вы можете настроить поведение базового объекта PDO, установив в своем объекте конфигурации строчную версию имени константы. Это работает как для параметров PDO (например \PDO::ATTR_CASE, будет attr_case), так и для параметров адаптера (например, для MySQL вы можете установить \PDO::MYSQL_ATTR_IGNORE_SPACEкак mysql_attr_ignore_space). 

Например, чтобы установить параметры приведенного выше примера:

$config = [
    "environments" => [
        "development" => [
            "adapter" => "mysql",
            # other adapter settings
            "attr_case" => \PDO::ATTR_CASE,
            "mysql_attr_ignore_space" => 1,
        ],
    ],
];

По умолчанию единственный атрибут, который устанавливает Phinx, - \PDO::ATTR_ERRMODEэто PDO::ERRMODE_EXCEPTION. Не рекомендуется отменять это.

MySQL

У адаптера MySQL есть досадное ограничение: некоторые действия вызывают неявную фиксацию независимо от состояния транзакции. Примечательно, что этот список включает , и , которые являются наиболее распространенными операциями, которые выполняет Phinx. Это означает, что в отличие от других адаптеров, которые будут пытаться изящно откатить транзакцию при неудачной миграции, если миграция не удалась для MySQL, она может оставить вашу БД в частично перенесенном состоянии.CREATE TABLEALTER TABLEDROP TABLE

SQLite

Объявление базы данных SQLite использует упрощенную структуру:

environments:
    development:
        adapter: sqlite
        name: ./data/derby
        suffix: ".db"    # Defaults to ".sqlite3"
    testing:
        adapter: sqlite
        memory: true     # Setting memory to *any* value overrides name

SQL Server

При использовании sqlsrvадаптера и подключении к именованному экземпляру вы должны опустить portнастройку, так как SQL Server будет согласовывать порт автоматически. Кроме того, опустите или измените значение, соответствующее UTF8 для SQL Server.charset: utf8charset: 65001

Пользовательские адаптеры

Вы можете предоставить собственный адаптер путем регистрации реализации Phinx \ Db \ адаптер \ AdapterInterface с AdapterFactory :

$name  = 'fizz';
$class = 'Acme\Adapter\FizzAdapter';

AdapterFactory::instance()->registerAdapter($name, $class);

Адаптеры можно зарегистрировать в любое время до вызова $ app-> run () , который обычно вызывается bin / phinx .

Псевдонимы

Имена классов создания шаблонов могут иметь псевдонимы и использоваться с параметром --classкомандной строки для команды Create .

Классы с псевдонимами по-прежнему потребуются для реализации Phinx\Migration\CreationInterfaceинтерфейса.

aliases:
    permission: \Namespace\Migrations\PermissionMigrationTemplateGenerator
    view: \Namespace\Migrations\ViewMigrationTemplateGenerator

Порядок версий

При откате или печати статуса миграций Phinx упорядочивает выполненные миграции в соответствии с version_orderопцией, которая может иметь следующие значения:

creation (по умолчанию): миграции упорядочиваются по времени их создания, которое также является частью их имени файла.

execution: миграции упорядочены по времени их выполнения, также известному как время начала.

Путь начальной загрузки

Вы можете указать путь к php-файлу начальной загрузки, который будет включен перед запуском любых команд phinx. Обратите внимание, что установка внешних переменных для изменения конфигурации не будет работать, потому что к этому моменту конфигурация уже была проанализирована.

paths:
    bootstrap: 'phinx-bootstrap.php'

В сценарии начальной загрузки будут доступны следующие переменные:

/**
 * @var string $filename The file name as provided by the configuration
 * @var string $filePath The absolute, real path to the file
 * @var \Symfony\Component\Console\Input\InputInterface $input The executing command's input object
 * @var \Symfony\Component\Console\Output\OutputInterface $output The executing command's output object
 * @var \Phinx\Console\Command\AbstractCommand $context the executing command object
 */