Selbstgeschriebene applikationsweite Funktionen

Hi,

wo schreibt ihr selbstgeschriebene Funktionen die Applikationsweit aufgerufen werden können?

Spezialisiere CWebApplication und bau deine Methoden da rein. Wenn sie nicht direkt auf die Application zugreifen kannst du sie static machen.

In den einzelnen Controllern kannst du dann mit Yii::app()->{deine Methode} darauf zugreifen.

Damit deine Application verwendet wird, musst du die index.php entsprechend anpassen.

Einfache einzelne Funktionen die man immer wieder mal verwendet hab ich in eine global_func.php in /protected/ gelegt und einfach in der index.php mit


require_once('protected/global_func.php');

vor


require_once($yii);

eingebunden.

Ich halte es für keine gute Idee, in deinen Klassen allgemeine Methoden zu verwenden, die irgendwo in der Applikation mit ‘require’ oder ‘include’ eingebunden werden. Klar kann man das machen, aber die Lokalität geht verlorgen und man sucht sich dumm und dämlich. Dann würde ich es vorziehen, diese Funktionen an einer Stelle zusammen einzubinden, die diese dann für die Application bereitstellt.

Die require - Idee halte ich auch nicht für gut.

Kannst du deinen Vorschlag konkretiesieren dave?

Ehrlichgesagt finde ich den einfachen require-Ansatz nicht so verkehrt - sogar Qiang schlägt einen solchen vor (siehe Cookbook: http://www.yiiframework.com/doc/cookbook/31/). Sämtliche einfachen globalen Funktionen wandern in einige wenige Files, die in der index.php required werden. Man muss es nicht komplizierter machen, als es sein muss ;)

für “spezielle dinge” kann man ja immer noch components schreiben glaub im app skeleton gabs ne time component. Also eine klasse ‘time’ oder sowas mit funktionen die genau dafür nur gebraucht werden, in dem fall zeit Ausgabefunktionen.

die kann man dann mit klasse::funktion() aufrufen

also wenn man wirklich mehr ordnung einbringen will.

der protected/components - Ordner zum Beispiel ist im include_path. Dort eine Klasse rein mit statischen Methoden und fertig. Kannst du überall verwenden.

In solchen Fällen baue ich mir einen Wrapper der Zugriff auf die gewünschten Funktionen liefert. Der Wrapper ist z.b. als komponente in yii eingebunden. Alle Klassen im Zusammenhang mit YII greifen über den Wrapper auf die globalen Funktionen zu. Der Wrapper included die natürlich mit require.

Dadurch behält man die Kontrolle an welcher Stelle "externe" Funktionen eingebunden werden und man kann sie für die gesamte Application kontrollieren, z.b aktivieren oder deaktivieren.

Die Lokalität erkennt man dann auch aus dem Code heraus. Wenn ich mir nach z.B einem halben Jahr nochmal ein Projekt anschauen muss, werde ich mich mit Sicherheit fragen, wo ist die Funktion denn definiert und an welcher Stelle wird diese eingebunden?

Ich habe nun den Weg gewählt, dass ich im Components-Ordner eine Klasse erstellt habe, die von nichts abgeleitet habe und nun sie aufrufe über

Klassenname::Methodenname

Dann weist du jedenfalls wo sie definiert ist ;)