frankx: Zend Frameworks Request Objekt - wie wird es "rumgereicht"

Beitrag lesen

Hellihello dedlfix,

Sie bekommen es immer durchgereicht. Die Haupt-Methode von Zend_Controller_Front ist dispatch(). Dort wird das Request-Objekt erzeugt, wenn keins übergeben wurde, was der Normalfall ist. Mittels setRequest() landet es in $this->_request. Analoges passiert mit dem Response-Objekt. (Plugin-Handling lass ich mal aus.) Der Router wird instantiiert, anschließend der Dispatcher, wobei ihm das Resp-O übergeben wird. Vom Router wird route() aufgerufen und das Req-O übergeben. Der ermittelt Modul, Controller und Action und hinterlegt diese Werte im Req-O. Vom Dispatcher wird nun dispatch() aufgerufen und dabei sowohl das Req-O als auch das Resp-O übergeben[1]. Dort wird der passende Action-Controller ermittelt und instantiiert, wobei wiederum Req-O und Resp-O übergeben werden. Vom AC wird dispatch() aufgerufen mit dem Action-Namen als Parameter. Die darin aufgerufene Action-Methode kann nun auf die beim Instantiieren des AC übergebenen Resp-O und Req-O zugreifen.

Könnte man zusammenfassen mit folgendem Beispielcode?

  
  
<?php  
class MySomeContentClass  
{  
 // to keep some test-values  
 protected $_myArray = array();  
  
 // set test values  
 public function addKeyValue($key,$value) {  
  $this->_myArray[$key]=$value;  
 }  
  
 // to get set testvalues  
 public function getMyArray() {  
  return $this->_myArray;  
 }  
}  
  
abstract class MyTestController  
{  
 // will be instance of MySomeContentClass  
 protected $_mySomeContentObject = null;  
  
 // to be defined in extending class  
 public function __construct() {  
 }  
  
 // zugriff auf das ContentObjekt  
 protected function _getMySomeContentObject() {  
  return $this->_mySomeContentObject;  
 }  
}  
  
class MyTestController1 extends MyTestController  
{  
 // weitere Instanz, eines zweiten Kontollers  
 protected $_myTestController2 = null;  
  
 public function __construct() {  
  // initiate ContentObjekt  
  $this->_mySomeContentObject = new MySomeContentClass();  
  // set test key-value-pair via own setter function  
  $this->_getMySomeContentObject()->addKeyValue("class1","value1");  
  // instanciate second controller - passing the ContentObjekt  
  $this->_myTestController2 = new MyTestController2($this->_getMySomeContentObject());  
 }  
  
 // get the ContentObjekt-contentArray  
 public function spitItOut() {  
  return $this->_getMySomeContentObject()->getMyArray();  
 }  
  
}  
  
class MyTestController2 extends MyTestController  
{  
  
 // gets first parameter an instance of MySomeContentClass  
 public function __construct(MySomeContentClass $instance) {  
  //sets passed object to private var - setter function missing for this test  
  $this->_mySomeContentObject = $instance;  
  // set second test key-value-pair via own setter function  
  $this->_getMySomeContentObject()->addKeyValue("class2","value2");  
 }  
}  
  
// initiate first controller, who will automatically initiate the second one in constructor  
$controll1 = new MyTestController1;  
// test output  
var_dump($controll1->spitItOut());  
/*  
array(2) {  
  ["class1"]=>  
  string(6) "value1"  
  ["class2"]=>  
  string(6) "value2"  
}  
*/  
  

Im Grunde ja einfach mal im Code schauen, aber so versiert bin ich da (noch ?) nicht.

Genau das musste ich auch machen,

Verdammt, ich verstrick mich da noch immer, obwohl ich es eigentlich lesen können müsste, da mir die einzelnen Bestandteile eigentlich langsam klar werden.

da meine aktive Zeit mit dem ZF bereits vor dem Erscheinen der Version 1 endete.

Warum denn das? Ich denke ja nach wie vor, wer was von PHP versteht, sollte die Grundzüge des ZF begreiffen. Aber das tust du ja, nur warum hast du aufgehört damit?

Da unter PHP5 ja Objekte generell als Referenz übergeben werden

s.o. code-beispiel, oder?

außer dass man es später wegoptimieren und für Release X eine Geschwindigkeitssteigerung proklamieren kann :-)

Denken die Damen und Herren bei Zend an sowas?
Dank und Gruß,

frankx

--
tryin to multitain  - Globus = Planet != Welt