php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.01.2012, 17:30  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard Externen Komponenten den ServiceContainer zur Verfügung stellen

Hallo,

beim Erstellen meines Frameworks habe ich bis jetzt auf Singleton verzichtet (bis auf Factories). Auch meine ursprüngliche Überlegung, den FrontController als Singleton zu realisieren, scheiterte kläglich, als ich versucht habe HMVC-ähnliche Knoten aufzurufen. Daher wird dieser nun, wie es sich gehört, normal instanziiert.

Hintergrund zum FC:
Ein Request landet beim FrontController. Der FC zieht dann den Router hinzu und wertet den Request aus. Der FrontController generiert dann mit diesen Daten und mit Hilfe eines ControllerBuilders (eine Art Factory) dann den Controller. Vor dem Ausführen der eigentlichen Action übergibt sich der FrontController nochmal selbst an den Controller. Das liegt daran, dass der FrontController Objekte enthält wie Config, Request, ServiceContainer etc, auf die man im Controller stets Zugriff haben sollte.


Ich bin so fixiert auf den FrontController, da dieser den Request, die Config, den Router oder auch den ServiceContainer (DI-Container) beinhaltet.

Nun kommen externe Komponenten ins Spiel: Als Beispiel nehme ich mal einen Logger, der nicht fester Bestandteil des Frameworks ist. Ein Writer dieses Loggers, etwa FirePHPWriter, muss auf meinen FrontController zugreifen könne, um den ServiceContainer zu bekommen, der wiederum eine Instanz von FirePHP spendet.

(Alternative: Der DatabaseWriter muss auf den Service 'PDO' zugreifen.)

Als mein FC noch Singleton war, konnte ich bequem sagen
PHP-Code:
FrontController::getInstance()->getServiceContainer->get('FirePHP'); 
Aber das geht ja nun nicht mehr, weil der ServiceContainer bzw. der FrontController nicht mehr global ansteuerbar ist.

Ich habe mir gedacht, nur den ServiceContainer als Singleton zu gestalten. Dieser ServiceContainer beinhaltet dann auch den Router, die Config etc.

Das widerspricht aber etwas meinem Prinzip, dass der ServiceContainer keine Framework-eigenen Objekte verwaltet.

Habt ihr eine Idee?
__________________
dsentker ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.01.2012, 18:26  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Komponente generell mit Controller/ServiceContainer-Instanz instanziieren?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 03.01.2012, 21:03  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Ja, mein Problem hat sich wohl erledigt. Die Config mache ich nun doch als Registry (sprich, Singleton) und externe Komponente selbst brauchen nicht auf den Service Container zuzugreifen, da sie selbst Teil des Containers sind. Diese werden dann nur im Controller angefragt.
__________________
dsentker ist offline   Mit Zitat antworten
Alt 04.01.2012, 09:09  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Ich habe das bei mir so gelöst, dass es pro Request ein "Context-Objekt" als Singleton gibt, dass alle relevanten Objekte, die man innerhalb der Applikation benötigt, enthält (Request, Response, DIC, Konfiguration, etc.). Der Aufruf gestaltet sich dann so:
PHP-Code:
ZNApplicationContext::instance()->getConfiguration();
ZNApplicationContext::instance()->getDIC();
ZNApplicationContext::instance()->getRequest();
// etc. 
Jetzt werden wieder einige aufschreien und meckern, dass das nicht besonders sauber sei. Aber: Ich habe wirklich lange an dem Problem gesessen und wenn man HMVC so umsetzen will, wie ich das in meinem Framework (Heißt, HMVC-Knoten sollen an jeder Stelle benutzt werden können), dann MUSS man irgendwo eine zentrale Stelle haben, die alle notwendigen Informationen enthält.
xm22 ist offline   Mit Zitat antworten
Alt 04.01.2012, 10:00  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.020
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Bei uns gibt es auch einen Kontext. Nur andersrum als bei xm22. Sprich der Kontext ist eine Eigenschaft des Requests und der wird via manueller Injektion durchgeschleift.
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 04.01.2012, 10:20  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Sprich der Kontext ist eine Eigenschaft des Requests und der wird via manueller Injektion durchgeschleift.
Das klingt gut. Was enthält bei euch das Kontext-Objekt?
xm22 ist offline   Mit Zitat antworten
Alt 04.01.2012, 10:34  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

@xm22
Aber bekommst du durch dein Context-Singleton keine Probleme? Wenn es einen internen Subrequest gibt, kann ZNApplicationContext doch nicht neu kreiert werden. Das bestehende Singleton wird demnach überschrieben. Somit hast du keine Kontrolle mehr über vorherige Stati, nachdem ein Subrequest ausgelöst wurde. Wie löst du das?
__________________
dsentker ist offline   Mit Zitat antworten
Alt 04.01.2012, 10:43  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Wenn es einen internen Subrequest gibt
Das Problem stellt sich in der Tat - Allerdings ist die Wahrscheinlichkeit, dass so etwas geschieht, meiner Erfahrung nach extrem gering. Aber ich bin jetzt am Überlegen, ob ich das Context-Objekt nicht doch durchreiche, da mir die Singleton-Lösung nicht besonders gut gefällt. Was mich bis jetzt daran gestört hat, war, dass auch das View dann das Context-Objekt explizit übergeben bekommen muss - Auf der anderen Seite greift es stattdessen über ein Singleton darauf zu, was eigentlich noch schlimmer ist.

Daher tendiere ich dazu, dass Context-Objekt doch manuell an Components (entsprechend Controllern) und Views durchzureichen.
xm22 ist offline   Mit Zitat antworten
Alt 04.01.2012, 10:55  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Ich überlege gerade, ob man nicht ein Singleton-Request-Wrapper-Objekt realisieren sollte. Jeder "neue" Reguest innerhalb der HMVC-Knoten wird dann im RequestWrapper-Stack gespeichert. Der Request selbst beinhaltet dann auch den DI-Container, die Konfiguration etc...

Also
PHP-Code:
RequestWrapper::getInstance()->getMaster()->getConfig()->foo
RequestWrapper
::getInstance()->getSub(2)->getContainer()->get('log'); // zweittiefste Node hervorholen 
Interessant wird es dann, wenn man die Subrequests nicht anhand einer Nummer (wie o.g.) aufruft, sondern wenn jeder Subrequest benannt ist, so dass jeder Subrequest anhand eines Namens identifiziert werden kann. Nur eine spontane Eingebung.
Was mich stört, ist, dass der Request dazu missbraucht wird, Container und Config mit sich rumzuschleppen.
__________________
dsentker ist offline   Mit Zitat antworten
Alt 04.01.2012, 11:06  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Was mich an diesen Subrequests stört, ist, dass das so klingt, als würde der komplette Dispatch-Prozess noch mal angestoßen. Mein Verständnis von HMVC ist, dass die einzelnen Knoten innerhalb des selben Life-Cycles benutzt werden sollten, weil sonst ein enormer Overhead entsteht.
xm22 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Objekte aus Klassenbibliothek zur Verfügung stellen ecomeback PHP Tipps 2008 8 14.10.2007 16:11
Klassensammlung über ein Objekt zur Verfügung stellen ecomeback PHP Tipps 2007 7 14.07.2007 00:01
Var außerhalb einer Funktion zur Verfügung stellen tinchen PHP Tipps 2006 6 13.08.2006 23:38
Variablen von einer externen Datei auslesen PHP Tipps 2005-2 7 22.08.2005 22:58

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
servicecontainer

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum