dedlfix: In nested class auf übergeordnete Klasse zugreifen

Beitrag lesen

echo $begrüßung;

Wenn ich nun noch eine Super-Pluginklasse als Zwischenschicht erstelle, sehe ich nicht, welche Verbesserung das bringen könnte außer einem Anstieg der Bürokratie.

Je größer ein Unternehmen wird, desto mehr müssen sich die Angestellten spezialisieren. Sie haben dann auch alle Hände mit ihrer Aufgabe zu tun. Einen Spezielisten auszutauschen ist verhältnismäßig einfach gegenüber einem Allrounder, bei dem man aufpassen muss, dass er alle Aufgaben gleich gut erfüllen kann.

Eine Möglichkeit, die ich hierin erahne, ist, auf die Übergabe der Instanz an die Pluginklasse zu verzichten, indem bei Einbindung des Plugins die Eigenschaften, z. B. die DB-Verbindung, an die Pluginsuperklasse statisch oder eine Instanz von ihr übergeben wird, auf der dann die eigentliche Pluginklasse operieren kann. Ist es das, worauf Du hinauswillst? Was ist aber mit essentiellen Methoden der einschachtelnden Instanz? Die kann ich ja schlecht alle an die Plugin-SK übergeben bzw., was wäre damit gewonnen?

Spezialisierung. Der Broker bekommt vom Controller gesagt: Wir haben jetzt Zustand X. Der Broker sagt all seinen Plugins: Arbeitet jetzt für Zustand X. Dazu gibt er ihnen das was sie dazu vielleicht benötigen und holt die Ergebnisse ab. Die Plugins arbeiten selbständig. Wenn es Arbeitsabläufe gibt, die alle gleichermaßen nutzen sollen/können, dann erben sie das von der Superklasse. Im Büro müssten stattdessen alle auf Schulung. Sie "betteln" jedenfalls nicht ihren Vorarbeiter an, ob er ihnen mal was erledigen kann.

Ich fürchte, ich verstehe Dich in diesem Punkt nicht richtig, oder aber es würde nur eine Zwischenschicht ohne wirklichen praktischen Zweck hinzugefügt.

Der Vorteil an der Spezialisierung ist die Trennung nach Aufgaben und eine leichtere Wartbarkeit jedes einzelnen Teiles. Eierlegende Wollmilchsäue liefern zwar viel, aber man hat damit auch jede Menge Arbeit.

Wenn man als Anwender nun seinen Plugins generell DB-Zugriff gewähren will, würde ich das Plugin_Abstract beerben und ihm zumindest eine Eigenschaft für die DB-Instanz hinzufügen. Der Broker bekäme die zusätzliche Aufgabe die DB-Instanz an die Plugins zu übergeben. Und der Controller muss so spezialisert werden, dass er den neuen Plugin-Broker verwendet, was aber mit einem überschriebenen Konstruktor erledigt ist.
Ui, das ist erst mal heftig. Kannst Du das anhand eines fiktiven Beispiels noch mal für mich nachvollziehbarer beschreiben? Das könnte durchaus in die Richtung gehen, die ich brauche.

Hier die drei Erweiterungen gegenüber den ZF-Klassen:

class My_Plugin_Abstract extends Zend_Controller_Plugin_Abstract {  
  protected $db;  
  
  public function setDb($db) {  
    $this->db = $db;  
  }  
}  
  
class My_Plugin_Broker extends Zend_Controller_Plugin_Broker {  
  private $db;  
  
  public function setDb($db) {  
    $this->db = $db;  
  }  
  
  // überschreiben der originalen Methode  
  public function registerPlugin(My_Plugin_Abstract $plugin, $stackIndex = null) {  
    Zend_Controller_Plugin_Broker::registerPlugin($plugin, $stackIndex);  
    $plugin->setDB($db);  
  }  
}  
  
class My_Controller_Front extends Zend_Controller_Front {  
  public function __construct() {  
    // damit wird My…Broker geladen und nicht der originale  
    $this->_plugins = new My_Plugin_Broker();  
    $this->_plugins->setDb(wo_auch_immer_die_db_instanz_herkommt);  
  }  
}

Die Plugins werden über die Controller-Instanz registriert, die die eigentliche Registrierung jedoch an die Broker-Instanz weiterreicht.

$front = Zend_Controller_Front::getInstance();  
$front->setControllerDirectory('/path/to/controllers')  
      ->registerPlugin(new MyPlugin());

Man könnte auch den Broker aus der Weiterreichung der DB-Instanz raushalten und diese dem Plugin gleich bei der Instantiierung übergeben. Eine andere Idee ist, die Übergabe abhängig vom Wert einer Klassenkonstanten des Plugins zu machen. Vielleicht braucht ja nicht jedes Plugin DB-Zugriff. Oder aber man erweitert den Broker so, dass er beim Registrieren nur den Klassennamen entgegennimmt und er sich um Instanttierung und Durchreichung von benötigten Objekten anhand der Klassenkonstanten-Werte kümmert.

echo "$verabschiedung $name";