调用 Phing 到 运行 Propel 1 数据库迁移时,是否有一种干净的方法来设置 class 自动加载?
Is there a clean way to set up class autoloading when calling Phing to run a Propel 1 database migration?
我在 Propel 1 中使用 migrations,效果很好。对于某些数据操作,我需要访问 Propel class,并需要访问父 class 以获取常用迁移方法,但由于我请求从 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
这很好用,只要我在每个需要它的 class 文件的开头都有自动加载和初始化代码:
$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');
好的,这行得通,但有点混乱 - 尽管这是官方推荐(请参阅上面的手册页 link 的底部)。为了干净起见,我想去掉这个重复的代码块。
我当然可以把它放在一个文件中,并在每个文件中使用一个 require
行,这会减少一些麻烦,但这不是很令人满意。我想知道是否有一个 -D
标志我可以传递给 Phing,也许像 bootstrap PHP 文件?
我想知道 -Dphp.classpath
是否会做些什么,因为这似乎是 a Phing core property,但这似乎没有任何区别。
@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 迁移 classes 现在可以完全自动加载和访问 Propel 的系统,无需任何预 class 样板代码。
我在 Propel 1 中使用 migrations,效果很好。对于某些数据操作,我需要访问 Propel class,并需要访问父 class 以获取常用迁移方法,但由于我请求从 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
这很好用,只要我在每个需要它的 class 文件的开头都有自动加载和初始化代码:
$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');
好的,这行得通,但有点混乱 - 尽管这是官方推荐(请参阅上面的手册页 link 的底部)。为了干净起见,我想去掉这个重复的代码块。
我当然可以把它放在一个文件中,并在每个文件中使用一个 require
行,这会减少一些麻烦,但这不是很令人满意。我想知道是否有一个 -D
标志我可以传递给 Phing,也许像 bootstrap PHP 文件?
我想知道 -Dphp.classpath
是否会做些什么,因为这似乎是 a Phing core property,但这似乎没有任何区别。
@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 迁移 classes 现在可以完全自动加载和访问 Propel 的系统,无需任何预 class 样板代码。