2016-03-26 7 views
2

Ich verwende migrations in Propel 1, die gut genug funktioniert. Für einige Datenoperationen benötige ich Zugriff auf die Propel-Klasse und auf eine Elternklasse für gängige Migrationsmethoden, aber da ich die Migration von Phing anfordere, scheint dies nicht trivial zu sein.Gibt es eine saubere Methode zum Einrichten der automatischen Klassenladefunktion, wenn Phing aufgerufen wird, um eine Migration der Propel 1-Datenbank auszuführen?

Ich nenne die Migration mit diesem Code:

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 

Das funktioniert gut, solange ich habe die automatischen Laden und Initialisierung Code am Anfang jeder Klassendatei, die es braucht:

$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'); 

OK, das funktioniert, aber es ist ein bisschen chaotisch - obwohl es eine offizielle Empfehlung ist (siehe den unteren Teil des Manuellen Link oben). Aus Gründen der Sauberkeit möchte ich diesen sich wiederholenden Codeblock entfernen.

Ich könnte natürlich nur dies in eine Datei und verwenden Sie eine einzige require Zeile in jeder Datei, die einige der Cruft reduzieren wird, aber das ist nicht sehr befriedigend. Ich frage mich, ob es eine -D Flag gibt, die ich an Phing weitergeben kann, vielleicht wie eine Bootstrap-PHP-Datei?

Ich fragte mich, ob -Dphp.classpath würde etwas tun, da dies scheint a Phing core property zu sein, aber das scheint keinen Unterschied zu machen.

+0

Sie könnten '-Dauto_prepend_file =' mit freundlicher Genehmigung von PHP verwenden, wenn Phing solche Überschreibungen erlaubt. – mario

+0

Dank @mario - gab es einen optimistischen Versuch, ohne Erfolg. Es scheint, dass die Info über [verfügbare Konsolenparameter] (https://www.phing.info/docs/guide/stable/sec.commandlineargs.html) ein wenig spärlich ist! – halfer

+0

Aha, ich verstehe was du meinst - füge es dem 'php' Befehl hinzu - was für eine gute Idee. Versuche das ... – halfer

Antwort

0

@mario machte einen freundlichen Vorschlag in den Kommentaren, die dieses Problem einwandfrei behoben. Ich zog die Autoload-Präambel in ein separates Skript:

<?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'); 

I modifizierte dann den php Anruf (dh anstatt den phing.php Aufruf) so:

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

Die Propel Migration Klassen haben jetzt volle Auto-Lade und Zugriff auf das Propel-System ohne Vorabcode.