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 04.01.2012, 16:54  
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

Nee - Ein HMVC-Knoten entspricht weitestgehend einer Deiner Actions. Stell Dir vor, die Action wäre ein Objekt mit run-Funktion, welche ein View zurück gibt. Ich sage also
PHP-Code:
$this->context->assembleComponent(Klasse-des-HMVC-Knotens, ...); 
$assembleComponent mappt intern auf eine ComponentFactory, die wahrscheinlich Deinem Verwalter entspricht. Eigentlich wäre es also
PHP-Code:
$this->context->getComponentFactory()->assemble(Klasse-des-HMVC-Knotens, ...); 
xm22 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 04.01.2012, 16:59  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Trainmaster
Natürlich instanziiere ich nicht einfach einen Service, sondern ein Service-Container übernimmt diese Aufgabe und ist zudem noch für die Injizierung von kontextrelevanten Objekten zuständig.
Ein klassischer DI / Service-Container also. So habe ich deine Aussagen auch verstanden, gehe jedoch nicht damit konform, ausgaberelevante Strukturen einem Service zu überlassen. Dafür gibt es die Action, die die Daten (sei es aus einem Model, Repository oder Service...) in eine View stopft.
Zitat:
Zitat von Trainmaster
Ein Request bleibt für mich in diesem ganzen Zusammenhang immer noch primär die Anfrage des Clienten. Damit ergeben sich meiner Meinung nach andere Anforderungen an die Verarbeitung des Requests, als es bei einem internen Request der Fall ist.
Das wäre?



Zitat:
Zitat von xm22 Beitrag anzeigen
Nee - Ein HMVC-Knoten entspricht weitestgehend einer Deiner Actions.
Also gibt es quasi keine Controller bei dir?

Zitat:
Zitat von xm22 Beitrag anzeigen
Stell Dir vor, die Action wäre ein Objekt mit run-Funktion, welche ein View zurück gibt. Ich sage also
PHP-Code:
$this->context->assembleComponent(Klasse-des-HMVC-Knotens, ...); 
$assembleComponent mappt intern auf eine ComponentFactory, die wahrscheinlich Deinem Verwalter entspricht. Eigentlich wäre es also
PHP-Code:
$this->context->getComponentFactory()->assemble(Klasse-des-HMVC-Knotens, ...); 
Und was macht die ComponentFactory dann mit dem String 'Klasse-des-HMVC-Knotens'? Sie initiiert das "Action-Objekt" mit diesen Namen und führt die Methode run aus?
__________________
dsentker ist offline   Mit Zitat antworten
Alt 04.01.2012, 17:24  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Zitat:
Zitat von dsentker Beitrag anzeigen
Dafür gibt es die Action, die die Daten (sei es aus einem Model, Repository oder Service...) in eine View stopft.
oder den View eines Service in einen anderen View stopft. Es gibt doch nichts schöneres, als die Verschachtelung von Views


Zitat:
Zitat von dsentker Beitrag anzeigen
Das wäre?
Einen internen Request durch einen Router zu jagen, womöglich noch mit Mehrsprachigkeit. Einfach unnötig. Für interne Requests ist eine Auflösung nach einer einfachen Namenskonvention ausreichend. Oder aber die zentrale Filterung des Requests, wie es oftmals anzutreffen ist. Du möchtest doch nicht ernsthaft einen internen Request durch Filter jagen? Schließlich sind das Anweisungen, die nicht vom Client, sondern vom Programmierer selbst kommen.

Natürlich kannst du jetzt argumentieren, dass für SubRequests all solche Dinge deaktiviert sind. Ich jedenfalls bevorzuge eine eigene, saubere Implementierung für interne Requests als solch eine beschnitttene Pseudo-Request-Implementierung.
Trainmaster ist offline   Mit Zitat antworten
Alt 04.01.2012, 17:39  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Trainmaster Beitrag anzeigen
oder den View eines Service in einen anderen View stopft. Es gibt doch nichts schöneres, als die Verschachtelung von Views
Dem stimme ich zu - Verschachtelte Views sind schön - aber nur, solange der Controller diese initiiert. Der Service selbst sollte dies nicht tun. Ist aber Auslegungssache, das handhabt jeder sicher anders.

Zitat:
Einen internen Request durch einen Router zu jagen, womöglich noch mit Mehrsprachigkeit. Einfach unnötig. Für interne Requests ist eine Auflösung nach einer einfachen Namenskonvention ausreichend. [...] Du möchtest doch nicht ernsthaft einen internen Request durch Filter jagen?
Was ist, wenn ich per URL-Parameter den Namen einer Route bekomme, die als Subrequest geladen werden soll?
Zitat:
Schließlich sind das Anweisungen, die nicht vom Client, sondern vom Programmierer selbst kommen.
Ein interner Request kann auch durch äußere Parameter definiert werden.

Zitat:
Natürlich kannst du jetzt argumentieren, dass für SubRequests all solche Dinge deaktiviert sind.
Sind sie aus o.g. Gründen nicht.

Zitat:
Ich jedenfalls bevorzuge eine eigene, saubere Implementierung für interne Requests als solch eine beschnitttene Pseudo-Request-Implementierung.
Ich sehe meine Lösung ebenfalls als sauber an, da das Instanziieren eines Controllers durch eine einzige Struktur angestoßen wird. Und "Pseudo-Request" ist, denke ich, die falsche Wortwahl, da es ein Request wie jeder andere auch ist - nur eben intern ausgeführt wird.

Ich könnte das Argument gelten lassen, dass das Jagen eines Requests durch den Router und Filter womöglich mehr Zeit kostet. Das lasse ich gelten, jedoch
a) gibt es Caching und
b) wenn eine ControllerAction in eine andere gestopft werden soll, hat man auch noch anndere Möglichkeiten. Etwa gibt es eine ControllerFactory, die anhand von ControllerNamen, ActionNamen und Parameter ein ControllerAggregate erzeugt (der sich dann letztendlich ausführen lässt). Oder man instantiiert den Controller wie jedes andere Objekt auch (new \Application\Controller\FooController() )
__________________
dsentker ist offline   Mit Zitat antworten
Alt 04.01.2012, 19:03  
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:
ausgaberelevante Strukturen einem Service zu überlassen
Wie schon gesagt - Das war ein falsch benutzter Begriff.
Zitat:
Also gibt es quasi keine Controller bei dir?
Doch, aber eben keine Actions - Jeder HMVC-Knoten (Component) entspricht einer Action - Nur eben als eigenes Objekt.
Zitat:
Und was macht die ComponentFactory dann mit dem String 'Klasse-des-HMVC-Knotens'?
Der STring enthält die Klasse des Components. Die ComponentFactory erzeugt die Instanz eines solchen und übernimmt das dazugehörige Dependency Injection. Zurück kommt das Component, auf welchen die run-Methode ausgeführt werden muss.
xm22 ist offline   Mit Zitat antworten
Alt 04.01.2012, 21:06  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Dem stimme ich zu - Verschachtelte Views sind schön - aber nur, solange der Controller diese initiiert. Der Service selbst sollte dies nicht tun. Ist aber Auslegungssache, das handhabt jeder sicher anders.
Auslegungssache ja, jedoch halte ich IoC auch hier für die beste Variante - sprich template-based HMVC. Damit ist über das composite pattern eine lose, gleichförmige Kopplung über Templates möglich und der Code wird sauber entkoppelt.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 04.01.2012, 21:31  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Das heisst, es wäre nicht falsch, seine View mit dem DI/Service-Container zu instanziieren? Das würde auf jeden Fall viele meiner Probleme lösen.
__________________
dsentker ist offline   Mit Zitat antworten
Alt 05.01.2012, 13:45  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Ich muss nochmal eine eigentlich beendete Diskussion aufgreifen:
Ich bin immer noch fest der Meinung, meine interne Request-Lösung für das Laden eines Controllers in einen anderen ist richtig. Um zu sehen, wie es andere Frameworks machen, bin ich (wieder mal) auf die Symfony2-Implementation gestoßen:
http://symfony.com/doc/2.0/book/cont...tml#forwarding

Zitat:
Zitat von Symfony2 Manual
Notice that the forward() method uses the same string representation of the controller used in the routing configuration.
[...]
A forward can be accomplished directly via the http_kernel service. A forward returns a Response object:
Es ist nahezu die gleiche Implementation, nur dass das "Forwarden" der HttpKernel übernimmt, bei mir der FrontController. Ich möchte nicht sagen, dass andere Frameworks gnadenlos richtig sind, aber ist Symfony2 denn mit dieser Technik so falsch?
__________________
dsentker ist offline   Mit Zitat antworten
Alt 05.01.2012, 13:53  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Symfony2 erlaubt es auch, Controller als Services zu definieren, siehe http://symfony.com/doc/current/cookb...r/service.html.

Und am Ende steht eines fest: Wir alle haben Recht.
Trainmaster ist offline   Mit Zitat antworten
Alt 05.01.2012, 14:00  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Symfony2 erlaubt es auch, Controller als Services zu definieren, siehe http://symfony.com/doc/current/cookb...r/service.html.
Oha. Das ist ja krank (nicht negativ gemeint). Aber das dachte ich auch, als ich sah dass selbst der HttpKernel ein Service ist. Ich weiss grad nicht, was ich davon halten soll.

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Und am Ende steht eines fest: Wir alle haben Recht.
Das sowieso
__________________
dsentker 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


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