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 01.12.2011, 20:17  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.168
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Dependency Injection in einen Controller. Wo mache ich das?

Hallo zusammen,

ich habe eine Frage, die (noch) nicht konkret mit einem Softwareprojekt zu tun hat. Geht eher Richtung Software-Design / Architektur.

Man nehme mal an, wir haben Controller die gewissen Abhängigkeiten. Um es besser testbar zu machen sollen die aber nicht im Controller erstellt werden, sondern von außen abgespritzt (... hä??? nein, natürlich 'injiziert' - abspritzen war nur der erste Treffer bei leo ) werden.

Beispiel:

PHP-Code:
class UserController extends SomeAbstractController 
{
    protected 
$mapper;
    
    public function 
__construct(UserMapper $mapper)
    {
        
$this->mapper $mapper;
    }    

So weit, so gut. Aber wo erstelle ich so ein UserMapper Objekt um es dann injizieren zu können? Wenn ich an das Zend Framework denke (andere kenne ich nicht wirklich), dann werden mir die Controller Instanzen durch den Dispatcher in irgendeiner Form erstellt. Da habe ich nämlich - soweit ich weiß - keine Möglichkeit dieser Form von DI.
Wenn ich aber etwas eigenes schreibe, was wäre eine geeignete Stelle ohne dabei aber auf Flexibilität beim Erstellen von anderen Controllern verzichten zu müssen?

Ich hab das jetzt einfach mal so runter geschrieben. Möglicher Weise sagt ihr jetzt, dass das so einfach gar nicht zu entscheiden ist und man sich im Vorfeld noch viel mehr Gedanken über die Architektur machen müsste. Wäre für mich auch ok, dann müsste ich das ein Stück weit nach hinten stellen, mir kam dieser Gedanke nur mal so. Eventuell hat aber jemand hier eine konkrete Ahnung / Idee, wie man das in ein paar Sätzen vorstellen kann.
__________________
Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)
dennis81 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 02.12.2011, 00:47  
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

Zitat:
sondern von außen abgespritzt (... hä??? nein, natürlich 'injiziert' - abspritzen war nur der erste Treffer bei leo ) werden.
Kannst Du uns allen so einen Mist einfach ersparen?

Sinnvollerweise erzeugt man die Objekte dort, wo auch die Controllerinstanz erzeugt wird.
__________________
--
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 02.12.2011, 08:18  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.168
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Kannst Du uns allen so einen Mist einfach ersparen?
Uhhhh.... verzeiht mir oh' Herr...

Zum sachlichen (PS: jetzt wo ich das schreibe... naja, o.g. ist auch nicht gerade sachlich... Aber Ausdruck und Form... egal jetzt):
Zitat:
Zitat von nikosch Beitrag anzeigen
Sinnvollerweise erzeugt man die Objekte dort, wo auch die Controllerinstanz erzeugt wird.
Ich habe z.B. eine index.php in der ich aus den Requests ermittel, welcher Controller instanziiert werden soll. Dafür könnte ich mir einen Router behauen oder im trivialen Fall einfach die Request-Variablen abfangen und so etwas in dieser Art anstellen:

PHP-Code:
try {
    
$controller = isset( $_REQUEST['controller'] ) ? $_REQUEST['controller'] : 'Index';
    
$controllername APP_NAMESPACE '\\Controller\\' $controller

    if ( 
file_exists(APPLICATION_PATH '/library/' $controllername '.php') ) {
        require_once 
$controllername '.php';
        
        
/*
         * @var $controller \Citkomm\Controller\AbstractConstroller
         */
        
$controller = new $controllername;
        
$controller->handle();
    } else {
        throw new 
ControllerControllerException('Controller does not exist');
    }
    
} catch 
/* Exceptions... */ 
So ein Controller erbt dann immer von einem abstrakten Controller und kennt eben die Methode handle().

PHP-Code:
public function handle()
    {
        
$action = isset($_REQUEST['action'])? $_REQUEST['action'] : 'index';
        
$actionMethod $action 'Action';
        
        if ( !
method_exists($this$actionMethod) ) {
            throw new 
UnknownActionException('Action ' $action ' is unknown');
        }
        
        
//Call the action
        
$this->$actionMethod();
        
        
$class substr(
                        
get_class($this),
                        
strrpos(get_class($this), '\\') + 1  
        
);
        
        
$viewScript $this->getViewPath() . '/' $class '/' $action '.phtml';
        
        if ( 
$this->viewEnabled && file_exists$viewScript ) ) {
            @include 
$this->getViewPath() . '/layout/html_head.phtml';
            include 
$viewScript;
            @include 
$this->getViewPath() . '/layout/html_foot.phtml';
        }
    } 
Grundsätzlich funktioniert das. Irgendwie ist das ganze aber nur halb durchdacht. Denn: Wenn ich automatisch entscheide, dass es sich um einen UserController handelt, woher soll ich dann wissen, dass da konkrete Abhängikeiten injiziert werden sollen.

Das ganze kommt aus einer kleinen Anwendung, wo ich mich versucht habe darum zu kümmern, die einzelnen Komponenten etwas zu entkoppeln. Mir kommt aber immer mehr und mehr der Verdacht, dass mir das gar nicht so gelungen ist. Bzw. dass es noch deutlich Optimierungsbedarf gibt.
__________________
Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)
dennis81 ist offline   Mit Zitat antworten
Alt 02.12.2011, 08:57  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

schau dir mal diesen Code an, vielleicht kriegste denkanstöße

https://github.com/synapsestudios/kohana-dependencies
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 02.12.2011, 09:30  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Das Problem ist in der Tat, zu ermitteln, welche Abhängigkeiten dem Controller injiziert werden müssen. Solange die Applikation noch überschaubar ist, bieten sich hierfür Constructor bzw. Setter bzw. Property Injection an. Was das genau alles ist, kannst du hier nachlesen: http://components.symfony-project.or...ency-Injection.

Mit steigender Komplexität würde ich mich an deiner Stelle nach Dependency Injection Container umsehen, wie bspw. von Symfony 2: http://symfony.com/doc/current/book/...container.html.
Trainmaster ist offline   Mit Zitat antworten
Alt 02.12.2011, 10:28  
Erfahrener Benutzer
 
Registriert seit: 28.09.2008
Beiträge: 1.168
PHP-Kenntnisse:
Fortgeschritten
Koala befindet sich auf einem aufstrebenden Ast
Standard

wenn ich das richtig seh, bedeutet "dependency injection",
daß ein Objekt abhängig von bestimmten Faktoren erzeugt wird.

Also z.B. daß die Art und Weise wie ein Controllerobjekt "aussieht"
von der Anwendungskonfiguration abhängt.

So sind z.B. verschiedene Konfigurationen für den Produktiveinsatz
und die Entwicklungsumgebung denkbar.

Die Frage "wo" dieses Controllerobjekt erzeugt wird stellt sich doch
in diesem Zusammenhang gar nicht.

Falls ich falsch liege bitte korrigieren.
__________________
Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.
Koala ist offline   Mit Zitat antworten
Alt 02.12.2011, 10:33  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.168
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard

Ja, an DI Container

edit: Irgendwie ist der Rest dieses Postings im Nirvana gelandet... Melde mich später noch mal.
__________________
Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)

Geändert von dennis81 (02.12.2011 um 10:49 Uhr).
dennis81 ist offline   Mit Zitat antworten
Alt 02.12.2011, 11:18  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Wenn du keinen IoC Container benutzen willst und nur eine Stelle außerhalb des Front Controller/Router/Action Controller Komplexes suchst, wo die Controller mit ihren jeweiligen Abhängigkeiten versorgt werden, bietet sich vllt. auch das (Abstract)* Factory Pattern an. In der Factory werden die Controller dann erzeugt und ggf. abhängig von äußeren Faktoren konfiguriert.

PHP-Code:
// anstatt: $controller = new $controllername
$factory = new ControllerFactoryImplementation();
$controller $factory->createController($controllername); 
*) Abstract Factory würde bedeuten dass es verschiedene Implementierungen der ControllerFactory für unterschiedliche Zwecke geben kann.
fab ist offline   Mit Zitat antworten
Alt 02.12.2011, 11:40  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.168
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard

Jau fab, dieser Gedanke ist mir vorhin zwischendurch auch gekommen.

Könnte in der Tat der korrekte Weg sein, wenn man DI Container vermeiden möchte (was bei mir jetzt nicht zwingend der Fall ist). Für den ersten Teil ist das hier erstmal erledigt. Würde mich natürlich freuen, wenn sich trotzdem noch welche melden, wenn sie Tipps und Anregungen haben. Danke soweit!
__________________
Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)
dennis81 ist offline   Mit Zitat antworten
Alt 06.12.2011, 01:03  
Erfahrener Benutzer
 
Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse:
Fortgeschritten
notyyy befindet sich auf einem aufstrebenden Ast
Standard

ich baue atm. auch intensiv meinen aus:
http://anydi.ainfach.de/

ist ein relativ alternativer Ansatz, aber sicher einen Blick wert. Derzeit entwickel ich intensiv daran, die Verwendung noch deutlich einfacher zu machen, ohne u.a. an der code completion einzubüßen. läuft wunderbar in Kombi mit dem ZF =)

selbstverständlich ist alles dokumentiert und die Testabdeckung müsste bei 98%+ liegen.
notyyy 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
Setter vs Constructor Injection Gruber's Hans Software-Design 6 03.10.2011 02:08
[Erledigt] MVC Mailversand in Model oder Controller? litterauspirna PHP Einsteiger 7 24.08.2011 21:08
Dependency Injection Container Anyone PHP-Fortgeschrittene 33 16.06.2011 08:28
[Erledigt] Zend Übergabe Controller an phtml-Datei Enigma228 PHP-Fortgeschrittene 2 21.05.2011 17:50
Zend Framework & Model-Controller Kopplung shredding PHP Einsteiger 5 14.03.2011 11:42
[Erledigt] Zend Framework - Controller Problem IcePHP PHP Einsteiger 4 10.02.2011 21:28
View | Controller | .. wohin mit Errors? d0ne Off-Topic Diskussionen 13 18.10.2010 17:42
Controller inkl. oder exkl. Action stayInside Software-Design 59 28.09.2010 07:50
[MVC] Daten verschlüsseln & entschlüsseln im Controller oder Model singu Software-Design 19 31.08.2010 00:18
Controller Hierarchie Dark Guardian Software-Design 18 27.10.2009 13:22
Componenten Controller Cout Software-Design 3 26.09.2009 00:59
Mehrere Controller auf einer Seite fat32 Software-Design 6 27.07.2009 16:55
Sql Injection durchführen? Matthiasnet PHP Tipps 2007 10 21.06.2007 21:16
[Erledigt] Dependency/Property Injection Off-Topic Diskussionen 1 18.05.2006 10:52
mysql injection wirkungsvoll verhindern PHP Tipps 2005 4 09.04.2005 18:08

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
zend getviewpath, zend framework dependency injection container, dependency injection in controller

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:40 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