在调用Phing运行Propel 1数据库迁移时,是否有一种设置类自动加载的简洁方法?

时间:2016-03-26 19:29:58

标签: php migration propel bootstrapping

我在Propel 1中使用migrations,效果不错。对于某些数据操作,我需要访问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是否会做某事,因为这似乎是a Phing core property,但这似乎没有任何区别。

1 个答案:

答案 0 :(得分:0)

@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的系统,而无需任何类前的样板代码。