XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   PHP, OOP und Array Übergabe (http://xhtmlforum.de/showthread.php?t=63223)

Praktikant 21.12.2010 23:07

Zitat:

Zitat von mantiz (Beitrag 483580)
Am Framework an sich habe ich die letzten 2 Monate gearbeitet, allerdings nicht am Stück. Vorher hatte ich bereits einen Versuch mit nahezu identischen Klassen wie aus dem Buch "PHP Design Patterns" unternommen, habe dann aber festgestellt, dass man Patterns nicht "einfach so" umsetzen sollte.

Das ist ja fast ne halbe Ewigkeit :p Mal schauen wie ich Zeit finde so etwas umzusetzen :)
Zitat:

Zitat von mantiz (Beitrag 483580)
Das stimmt auf jeden Fall, Performance geht verloren, aber das ist klar, anders geht's halt nicht. :)
Für mich besteht der Vorteil darin, dass ich mich nicht um so Dinge wie das quoten der Spalten oder escapen der Werte kümmern muss, weil das von DbQuery automatisch vorgenommen wird, das hilft schonmal bei der Übersichtlichkeit.
Zusätzlich bleibt man zu einem gewissen Grad portabel.

Mir geht es dabei darum eine Klasse/ein Framework zu haben, was ich mit möglichst wenig Änderungen in vielen Projekten schnell einsetzen kann. Damit diese dann schneller vom Stapel laufen. Entwicklungen von anderen mag ich auch nicht so extrem.... Ich habe da immer dieses Gefühl "Hoffentlich geht nichts kaputt, was du noch nicht gefunden hast!" :D

Wie realisierst du das Lazy-Loading? Mit der Methode __autoload() von php, oder hast du dir da auch etwas eigenes geschrieben?

mantiz 22.12.2010 03:28

Zitat:

Zitat von Praktikant (Beitrag 483672)
Wie realisierst du das Lazy-Loading? Mit der Methode __autoload() von php, oder hast du dir da auch etwas eigenes geschrieben?

Ja, per __autoload werden die Dateien automatisch eingebunden und fast jedes Objekt wird erst in den get-Methoden, also bei Bedarf, erstellt.

Ein einfaches Beispiel (ohne zusätzliche Config) könnte sein:
PHP-Code:

public function getRouter() {
   if (!
is_object($this->router) && $this->router !== null) {
      
$routerClass = (string)$this->router;
      
$this->router = new $routerClass();
      return 
$this->router;
   }
   return 
null;


Im Setter kann entweder ein Objekt oder ein String (Klassenname) übergeben werden.
So sind sämtliche Klassen schonmal änderbar, ohne dass man die Objekte im Vorfeld erstellen muss, nur bei zusätzlicher Config.

David 22.12.2010 11:27

Was genau macht denn deine Routerklasse?

mantiz 22.12.2010 12:24

Der Router ermittelt den Controller und die Action, welche aufgerufen werden soll anhand eines Strings.
Ich verwende dazu im Frontcontroller die RequestUri, aber man könnte auch einen GET-Parameter verwenden oder sonstwas.

Routen können dann z.B. so aussehen:
Code:

<auth>
        <route>/:action/*</route>
        <defaults>
                <controller>auth</controller>
                <action>login</action>
        </defaults>
        <regex>
                <action>login|logout</action>
        </regex>
</auth>

Im Grunde ist das ähnlich dem Regex-Router von Zend. Und CakePHP macht es, wenn ich mich recht erinnere, auch so ähnlich.
Die Route wird in einen regulären Ausdruck übersetzt und geprüft, ob dieser Ausdruck auf den String passt, dann werden anhand dessen die Variablen (hier nur action) und Übergabe-Parameter (alles was auf * passt) bestimmt und ggfs. die Defaults gesetzt.
Anschließend werden noch die Variablen gegen die Ausdrücke in "regex" geprüft, wenn alles stimmt, wird die Route verwendet.
Hier wird die Action auf "login" und "logout" beschränkt, die Route passt also nur für Anfragen der Form "/login", "/login/*", "/logout", "/logout/*".
Der angegebene Controller-Name ist ein eindeutiger Schlüssel für den Controller.

Die Config vom Controller sieht dann so aus:
Code:

<controllers>
        <auth>
                <class>Auth_Controller</class>
                <loginRedirectUrl>/admin</loginRedirectUrl>
        </auth>
</controllers>

Der Auth-Controller stellt bei mir das Login-Formular dar und führt bei einem Post-Request einen Login durch.
Man kann aber auch einen anderen Auth-Controller schreiben und diesen so ziemlich simpel in der Config ändern.

Die ganze Config scheint aufwendig zu sein, aber bei manchen Frameworks ist das so, dass diese einfach ein festes URI-Schema verwenden, was dann so ähnlich aussieht wie: /<controller>/<action>/<params>.
Wobei der default von <controller> und <action> meistens auf "index" gesetzt wird und die Parameter natürlich optional sind.
Das bedeutet aber, dass die URIs quasi fest vorgegeben sind, die Controller müssen also entsprechend den gewünschten URIs benannt werden.
Und genau dafür ist der Router da.

David 22.12.2010 12:55

Also zusammengefasst parst der Router die Permalinks und entscheidet, wie es weiter geht?!

mantiz 22.12.2010 13:38

So ungefähr, ja.


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:46 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2021, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2020