Symfony, symlinks und Cache Problem

Nach einiger Zeit habe ich mal wieder an einem Symfony-Projekt gearbeitet und eine Kleinigkeit geändert. Eigentlich war es nur eine simple Konfigurationseinstellung. Notwendigerweise musste ich dafür den Cache löschen (symfony cc). Damit hatte ich mir dann aber erst richtig Probleme an Land gezogen.

Beim nächsten Aufruf der Seite wurde der Cache neu erzeugt und alles erschien zunächst sauber. Als ich mich dann einloggen wollte, bekam ich einen Fehler, dass die Methode „setReferrer“ auf dem User Objekt nicht gefunden werden kann. Ein Blick in den Cache zeigte mir, dass der autoloader diese Klasse an einer ganz anderen Stelle (test) gefunden hatte, als er sollte.

Das konnte ich beheben, in dem ich diese Klasse an einen anderen Ort verschoben habe. Damit wurde wieder die richitge Datei gezogen. Wie ich nun weiß lag dies daran, dass der Ort an dem die Klasse nun lag vor dem Alten Ort durchsucht wurde. Und damit das Rennen um den Platz im Classpath (autoload) gewonnen hatte.

Das nächste Problem zeigte sich dann mit der Basisklasse für alle DoctrineForms. Auch hier war die gefundene Klasse falsch, noch schlimmer, es war ein Template welches nicht mal zu parsen war. Die Datei begann mit „[?php“ anstatt „<?php“.

Auch hier zeigte sich die Ursache im Autoloader. Dieser zeigte eben statt der echten Implementierung auf ein File aus den Templates der Symfony Sourcen. Diese sollten aber niemals durch den autoloader gefunden werden.

Was war  also passiert? In der Vorbereitung auf einen Umstieg auf eine andere Version von symfony hatten wir den echten Symfony Ordner mit einer Versionsnummer (symfony-1.2.1) versehen. Den Ordner „symfony“ hatten wir zu einem symlink auf diesen Ordner gemacht. Kein Problem, solange man den Cache nicht neu aufbaut.

Dann nämlich, wird zwar der symbolische Link vom Parsen ausgenommen, nicht aber der neue „echte“ Ordner. Damit werden ebenfalls die Templates aus den symfony libs in den autoloader geschrieben. Die echten Implementierungen bleiben unberücksichtigt.

Was also tun? Man kann die echten symfony files außerhalb des „lib“ Ordner ablegen und den symlink entsprechend anpassen, oder aber in der autoload.yml unter „\lib\vendor\symfony\lib\config\config\autoload.yml“ die echten Ordnernamen im exclude hinzufügen.

Einen Kommentar schreiben: