Есть ли чистый способ настроить автозагрузку классов при вызове Phing для запуска миграции базы данных Propel 1?

я использую миграции в Propel 1, который работает достаточно хорошо. Для некоторых операций с данными мне нужен доступ к классу Propel и родительскому классу для распространенных методов миграции, но, поскольку я запрашиваю миграцию с Phing, это кажется нетривиальным.

Я называю миграцию, используя этот код:

php \
/project/backend-app/vendor/phing/phing/bin/phing.php \
-f /project/backend-app/vendor/propel/propel1/generator/build.xml \
-Dusing.propel-gen=true \
-Dproject.dir=/project/backend-app/db \
-Dpropel.database.url='mysql:dbname=job_crawler_test;host=127.0.0.1' \
-Dpropel.buildtime.conf.file='buildtime/job_crawler_test.xml' \
-quiet \
migrate

Это работает нормально, если у меня есть код автозагрузки и инициализации в начале каждого файла класса, который нуждается в этом:

$root = realpath(__DIR__ . '/../..');
require_once $root . '/vendor/autoload.php';
require_once $root . '/lib/autoload.php';
set_include_path($root . '/lib' . PATH_SEPARATOR . get_include_path());
Propel::init($root . '/config/propel-conf.php');

Хорошо, это работает, но это немного грязно — даже если это официальная рекомендация (см. Ссылку внизу страницы руководства выше). Для чистоты я хотел бы убрать этот повторяющийся блок кода.

Я мог бы, конечно, просто положить это в файл и использовать один require Строка в каждом файле, которая уменьшит некоторые потери, но это не очень удовлетворительно. Интересно, есть ли -D флаг, который я могу передать Phing, может быть, как файл PHP начальной загрузки?

Интересно, если -Dphp.classpath будет делать что-то, учитывая, что это, кажется, свойство ядра Phing, но это, кажется, не имеет никакого значения.

2

Решение

@mario сделал доброе предложение в комментариях, которое исправило эту проблему без ошибок. Я переместил преамбулу автозагрузки в отдельный скрипт:

<?php

/*
* db/scripts/propel-migration.php
*
* Bootstrap file for Propel migrations that need autoloading or access
* to the Propel sub-system
*/

$root = realpath(__DIR__ . '/../..');
require_once $root . '/vendor/autoload.php';
require_once $root . '/lib/autoload.php';
set_include_path($root . '/lib' . PATH_SEPARATOR . get_include_path());
\Propel::init($root . '/config/JobCrawler-conf.php');

Затем я изменил php звонить (т.е. вместо phing.php позвони) таким образом:

php \
-d 'auto_prepend_file=/project/backend-app/db/scripts/propel-migration.php' \
<rest of call here>

Классы миграции Propel теперь имеют полную автоматическую загрузку и доступ к системе Propel без какого-либо стандартного кода.

0

Другие решения

Других решений пока нет …