Einzelnen Beitrag anzeigen
  #10 (permalink)  
Alt 14.12.2010, 11:56
Benutzerbild von mantiz
mantiz mantiz ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.845
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Naja, ich habe da keine bestimmte Regel oder sowas.

Ich versuche sämtliche Variablen so lokal wie möglich zu halten und sämtliche Werte, welche Konfiguration oder Resourcen oder ähnliches sind im Objekt bzw. der Klasse zu speichern.

Als Beispiel hier mal die Attribute meines abstrakten Controllers:
PHP-Code:
protected $acl;
protected 
$auth;
protected 
$authAdapters = array();
protected 
$config;
protected 
$controllerKey;
protected 
$dbConnections = array();
protected 
$frontcontroller;
protected 
$messages = array();
protected 
$models = array();
protected 
$refClass;
protected 
$request;
protected 
$response;
protected 
$router;
protected 
$session;
protected 
$view
Hier die des Frontcontrollers welcher natürlich von AbstractController erbt:
PHP-Code:
protected $controllers = array();
protected 
$layoutEnabled true;
protected 
$preDispatchFilter;
protected 
$postDispatchFilter
Nun werden natürlich nicht sämtliche Attribute ständig verwendet, am Beispiel des Request-Objektes einmal verdeutlicht:

Das Request-Objekt, sowie sämtliche Controller, werden (standardmäßig) im Frontcontroller erstellt, dabei wird den Controllern die Instanz des Frontcontrollers übergeben.

Nun sieht die Methode getRequest() im AbstractController folgendermaßen aus (hier vereinfacht):
PHP-Code:
public function getRequest() {
    if (
$this->request !== null) {
        return 
$this->request;
    }
    
    if ((
$fc $this->getFrontcontroller()) !== null) {
        if (
$fc !== $this) { // avoid recursion
            
return $fc->getRequest();
        }
    }
    
    return 
null;

Auf die Art habe ich sämtliche Getter implementiert, so dass im Controller ein simples "$this->getRequest()" ausreicht, um an das richtige Objekt zu gelangen, ebenso wäre es aber möglich bestimmten Controllern ein anderes Request-Objekt zu geben.
Im Detail wäre es wohl zu viel alles zu erklären, hier nur mal als Idee.

Hier kommen imo nur Attribute in Frage, alles andere wäre unnötig kompliziert und redundant.

Ein anderes Beispiel wäre meine DbTable-Klasse, wo ich ein wenig von Zend abgeschaut habe, hier habe ich die Attribute:
PHP-Code:
protected $dbConnection;
protected 
$name;
protected 
$primary
In $dbConnection wird die aktuelle Datenbankverbindung gespeichert (inkl. Datenbank), $name enthält den Tabellennamen und $primary den Namen der Spalte, welche den Primärschlüssel angibt.
So kann man so schön kurze, sowie unabhängige Methoden wie z.B.:
PHP-Code:
public function find($primary) {
    return 
$this->fetch(array($this->primary => $primary));

schreiben, also z.B.
PHP-Code:
$commentModel = new DbTable($dbConnection'comments''id');
// ...
$comment $commentModel->find(1); 
anstelle von
PHP-Code:
$commentModel = new DbTable($dbConnection'comments''id');
// ...
$comment $commentModel->fetch(array('id' => 1)); 
Der Code wird imo generischer und besser wartbar.

Dazu sollte ich aber noch sagen, dass bei mir die Angaben zum Tabellennamen und Primärschlüssel ebensowenig im Code stehen (das habe ich hier nur kurz so gemacht), sondern per Config gesetzt werden.

So kann der Primärschlüssel z.B. von "id" nach "commentId" geändert werden, die Änderung wird in der Config-Datei vorgenommen und man ist fertig.
Mit Zitat antworten
Sponsored Links