2010-11-04 5 views
9

Ich habe ein seltsames Problem. Ich mag die automatische Generierung von meinen Proxies in Lehre auszuschalten 2. ich diese Zeile Code gefunden, die tun sollen (und tut) den Trick:Doktrin 2. Auto Generieren von Proxies

$config->setProxyDir(APPPATHSYSTEM."/proxies"); 
$config->setProxyNamespace('Proxies'); 

// Auto generate proxies for development 
$config->setAutoGenerateProxyClasses(DEVELOPMENT); 

Auf meiner Testumgebung der Proxys bei Anwendung befinden/Proxies. d.h .:

application/proxies/BaseUserProxy.php 

Wenn ich auf der Live-Umgebung bin mein Code plötzlich sucht die Proxies bei application/Proxies/Proxies, die nicht die tatsächliche Lage.

Ich verstehe, dass es etwas mit dem Namespace zu tun hat, aber ich verstehe nicht, warum es anders verhält, wenn Sie die setAutoGenerateProxy Methode verwenden.

Irgendwelche Ideen?

bearbeiten

habe ich die neuen Proxies generieren die Verwendung:

orm:generate-proxies 

Option.

Was mir diesen Ausgang gab:

php doctrine.php orm:generate-proxies 
Processing entity "Base\Element" 
Processing entity "Base\Page" 
... 
Processing entity "Base\Site" 

Proxy classes generated to "/var/www/application/proxies" 

in der letzten Zeile der Suche werden die Proxies in/var/www/application/Proxies generiert. Die Verzeichnisliste sieht so aus:

BaseElementProxy.php 
BasePageProxy.php 
... 
BaseSiteProxy.php 

So gibt es kein zusätzliches Proxies-Verzeichnis. Aber wenn ich meine Webseite neu laden, denkt, dass es da ist, es gibt mir die folgende Fehlermeldung:

Warning: require(/var/www/application//proxies/Proxies/BaseUserProxy.php) 
[function.require]: failed to open stream: 
No such file or directory in /var/www/library/Doctrine/Common/ClassLoader.php on line 148 

Warum ist das zusätzliche Proxies Verzeichnis hinzugefügt? Wenn ich die Proxies bei jeder Anfrage erzeuge, wird nicht im Verzeichnis für zusätzliche Proxies gesucht. Irgendjemand?

@Bryan M.: Das ist keine Lösung, sondern ein Workaround. Außerdem funktioniert es nicht. Wenn Sie die Proxies generieren, werden sie, wenn Sie Ihren Vorschlag anwenden, in APPPATHSYSTEM generiert und meine Webapp wird versuchen, sie von APPPATHSYSTEM zu laden. "Proxies". Das Problem ist, dass das System für die Proxies an verschiedenen Orten aussieht, wenn ich benutze:

$config->setAutoGenerateProxyClasses(DEVELOPMENT); 

Wenn DEVELOPMENT wahr ist, ist es bei APPPATHSYSTEM aussehen wird. Wenn DEVELOPMENT auf false gesetzt ist, wird APPPATHSYSTEM "Proxies" angezeigt. Nur die DEVELOPMENT-Konstanz zu wechseln bricht meine Anwendung, was theoretisch nicht möglich sein sollte.

+0

Versuchen Sie, das Proxys-Verzeichnis nur auf APPPATHSYSTEM zu setzen. Es sollte den Namespace 'Proxies' von dort abholen. –

Antwort

2

Ich glaube nicht, dass AutoGenerated Proxies kümmern.

Statt automatisch generierte Proxys zur Produktion zu schieben, sollten Sie wahrscheinlich doctrine orm:generate-proxies, die ich vermute, wird sie an der Stelle, die Ihr Produktionscode konfiguriert ist, um sie zu suchen.

+0

Ich habe es versucht. Überprüfen Sie meine Bearbeitung. –

4

Entwickeln Sie unter OS X und die Bereitstellung auf Linux? Das Dateisystem von OS X ist case insensitive.Ich werde also oft auf ein Problem stoßen, bei dem ich den Fall einer Klasse falsch schreibe, und es läuft und passt gut in der lokalen Umgebung, aber drosselt auf unserem Server.

In diesem Fall kann der Namespace "Proxies" in OS X auf "/ proxies" auflösen, aber in der Produktion kann er den Klassenordner nicht finden und erstellt ihn unter "/ proxies/Proxies ".

3

Wenn Sie den Ordner in "/ temp" umbenennen, erkennen Sie den Unterschied zwischen Pfad und Namespace.

Der Pfad ist der absolute Pfad zu dem Verzeichnis, in das die Proxies generiert werden. Der Namespace ist erforderlich, damit Sie konfigurieren können, wie ein Autoloader diese Entitäten aufnimmt.

Der Pfad in Ihrem Fall muss etwas wie "Proxys/Proxies" sein und der Namespace ist dann "Proxies". Ihr Autoloader muss so konfiguriert sein, dass er das Namespacepräfix "Proxies" im Verzeichnis "proxies /" abgehört.

Dies ist alles Stimmung mit Doctrine 2 RC1, aber wir fanden eine Möglichkeit, einen Proxy-Pfad ohne Hilfe eines Autoloaders ohne zusätzliche Kosten explizit zu laden. Der Proxy-Namespace configura ist daher nur notwendig, um sicherzustellen, dass sich keine anderen Klassen im selben Namespace wie die Proxies befinden.

+0

Ich kenne den Unterschied zwischen einem Namespace und einem Pfad :). Lies meinen Beitrag noch einmal für das eigentliche Problem. Danke für Ihre Reaktion. –