php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 15.06.2011, 21:32  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
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:
dass ich bei neuen Modulen nicht jedesmal den Core erweitern muss, sondern in diesem neuen Modul lediglich meine Abhängigkeiten bekanntmachen muss und diese automatisch injiziert bekomme.
DI-Container Klasse ableiten und erweitern. WO ist das Problem?
__________________
--
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
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 15.06.2011, 21:46  
Benutzer
 
Registriert seit: 16.07.2010
Beiträge: 80
PHP-Kenntnisse:
Fortgeschritten
SinnlosS befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
DI-Container Klasse ableiten und erweitern. WO ist das Problem?
Eine Datei mehr die ich ändern muss
Wenn ich es nach meiner Methode bequemer finde und statt mit Reflection/serialize/call_user_func_array-Constructor-Injection rumzuhampeln mit Setter-Injection arbeite, wo ist dann da das große Problem? Performance, klar, die wird nach deinem Vorschlag etwas besser sein. Es gehen aber nicht sonderlich viele Calls (dafür eben recht unterschiedliche) pro Request darüber, die Module selber laufen dann meist autark.

Zumindest halte ich es insofern simpel, als ich die Abhängigkeiten über normalen PHP-Code deklariere, statt über Annotations oder zusätzlich ini/xml/sonstwas-files, was ich wiederum nicht mag.
SinnlosS ist offline   Mit Zitat antworten
Alt 15.06.2011, 23:57  
Neuer Benutzer
 
Registriert seit: 15.06.2011
Beiträge: 14
PHP-Kenntnisse:
Fortgeschritten
joshiausdemall befindet sich auf einem aufstrebenden Ast
Standard

Der Symfony DIC (wurde bereits genannt - ich kenne leider daneben keine vernünftige Implementierung im PHP-Umfeld, wie weit die Flow3-Typen sind, weiß ich nicht) konfiguriert via yaml, xml oder Plain-PHP. Addons erlauben mittlerweile sowas wie Autowiring via Convention oder PHPDoc/Annotations.

Die Konfiguration ist sehr teuer - einerseits muss fleißig geparst werden, und auch das Resolving ist nicht ganz ohne.

Daher wird aus der Konfiguration einmalig ein Di-Container erzeugt, der dann nachhaltig zur Verfügung steht. Hier muss nichts erweitert werden oder sonst code-seitig etwas passieren - der DIC ist ein Werkzeug, das einen Erzeuger bereitstellt, der über eine Konfiguration wiederum "sich selbst" persistent generieren kann.

Teure Reflection-Calls sind daher ebenso wie das teure Parsing nicht-nativer Formate wie Yaml kein Problem, da das ganze eben nicht zur Laufzeit passiert. Was dabei heraus kommt, ist ein großer, weg-gecachter "Container", der ausschließlich Getter und generierten Initialisierungscode auf die vorkonfigurierten Services trägt.

Zu den Vorteilen der Geschichte:
Im Grunde ist das ganze eine gute Sache, um sauberen Code zu erzwingen: Schreibt man seine API gegen den Container (oder mit dem Container "In Mind"), spart man sich von vorne herein eine Menge Initialsierungscode, denn der DI-Builder bzw. die Konfiguration nimmt einem genau diese Arbeit ab.

Mit dem Sahnehäubchen, dass alles auch noch schön decoupled bleibt - ein Paradigma, das im Daily Business mal schnell auf der Strecke bleibt - wer was anderes behauptet, lügt

Leider hat das ganze auch einen Nachteil: So ganz rapid ist das Zeug anfänglich nicht, man braucht ein paar Tage, um sich damit als Entwickler von "DI-Controlled Code" anzufreunden. Noch bitterer trifft es den API-User:

PHP-Code:
$myService $this->container->get('my.service'); $myService-> //... Wo zum Teufel ist meine heiß geliebte IDE-Code-Completion? 
Annotation-driven Service Definition und Annotation driven injection/autowiring können hier Abhilfe schaffen. Das klappt performant aber wiederum nur *innerhalb* des Containers - denn der wird *vor* der Laufzeit sozusagen "kompiliert".

Alle Klassen, die den DIC verwenden, aber nicht selbst Service sind (im Symfony-Kontext sind das Klassen, die bspw. ContainerAware implementieren), gucken in die Röhre - denn hier muss wieder Reflection zur Runtime herhalten, um bspw. Annotations oder Naming-Conventions zu interpretieren, wie es bspw. Grails macht ("xyzService" wird automagisch injected, weil "Service" dran hängt). Und selbst sowas würde den Martin F. wahrscheinlich auf die Palme bringen - gerade die Magie ist ja das, was man vermeiden möchte.

Dennoch: Man muss sich die Frage stellen, wo man den "Starting-Point" überhaupt sucht? Klassischerweise ist dieser im Controller zu finden - und es spricht nichts dagegen, Controller gleichfalls als DIC-Managed Service zu definieren - Symfony stellt das zur Wahl.

Also letztlich würde ich das ganze als eine praktische Sache bewerten.

Geändert von joshiausdemall (16.06.2011 um 00:31 Uhr).
joshiausdemall ist offline   Mit Zitat antworten
Alt 16.06.2011, 08:28  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.167
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:
Ich tendiere jetzt grad auch schon wieder eher Richtung Setter-Injections
Das ist aber unflexibel bei Methoden, die etwas komplexer sind, als einfache Setter. Was z. B., wenn man etwas hinzufügen will? Bsp.: Ich habe einen Logger, der eine Add-Methode für Writer hat, welche dann so aufgerufen wird:
PHP-Code:
$logger->addWriter('ERROR'$writer); 
Oder was ist, wenn eine Methode einfach mit unterschiedlichen Parametern mehrfach aufgerufen werden soll?
Da kommt man mit einem einfachen Setter nicht weiter. Daher habe ich mir jetzt eine Klasse geschrieben, die mit folgender Konfiguration arbeitet. Inspiriert ist das Ganze von den DI-Containern von Symfony, APF und Yadif.
PHP-Code:
    return array(
        
'bindings'=>array(
            
'password'=>'{bound_password}',
            
'bound_password'=>'123456'
        
),
        
'services'=>array(
            
'screenLogWriter'=>array(
                
'service'=>'ZN_Log_Writer_Screen',
                
'args'=>array(),
                
'singleton'=>true,
                
'methods'=>array(
                    
'setFormat'=>"%1\$s [%2\$s]\n--------------------------------------------------------------------------------\n%3\$s\n--------------------------------------------------------------------------------\n\n"
                
)
            ),
            
'forwardMessages'=>array(
                
'service'=>'ZN_MessageStorage',
                
'args'=>array(),
                
'singleton'=>true,
                
'methods'=>array(
                    
'setStorage'=>'@messageStorage'
                
)
            ),
            
'messageStorage'=>array(
                
'service'=>'ZN_Storage_Session',
                
'args'=>array(),
                
'singleton'=>true,
                
'methods'=>array(
                    
'setNamespace'=>'messages'
                
)
            ),
            
'log'=>array(
                
'service'=>'ZN_Log'
                'args'
=>array(),
                
'singleton'=>true,
                
'methods'=>array(
                    
'addWriter'=>array(
                        array(
'INFO''@screenLogWriter'),
                        array(
'ERROR''@screenLogWriter')
                    )
                ),
            ),
            
'config'=>array() //Must be set manually
        
)
    ); 
Das Ganze ist superschlank, dadurch performant und so flexibel, dass man alle Fälle, die mir eingefallen sind, abdecken kann.

Wenn es mehr als 1 $arg gibt, wird das Objekt per Reflection instanziiert, ansonsten einfach per Konstruktor. Wenn Methoden mehr als einen Parameter haben, kommt call_user_func_array zum Einsatz, ansonsten wird einfach die entsprechende MEthode aufgerufen.
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
jQuery <div> Container generieren lassen ? dreamcatcher JavaScript, Ajax und mehr 5 23.02.2011 14:01
[Erledigt] Mehrere DIV Container mit einem Klick ändern (mit mehreren Request Aufrufe Lebenssonde JavaScript, Ajax und mehr 11 26.08.2010 09:01
Netz von Objekten mit Abhängigkeiten darstellen/zeichnen serPHPico PHP-Fortgeschrittene 12 25.08.2010 18:52
kürzeren div container authoatisch der höhe des contends anpassen litterauspirna HTML, Usability und Barrierefreiheit 15 29.07.2009 00:57
2 div Container immer gleich lang Kein Genie HTML, Usability und Barrierefreiheit 4 27.07.2009 13:38
Links vom Untermenü in Container öffnen Surfer PHP Tipps 2008 0 27.12.2008 19:24
[Erledigt] Zentrieren von a Blocks im DIV Container Daniel HTML, Usability und Barrierefreiheit 21 24.09.2008 09:37
[CSS] Container in Container Igäl HTML, Usability und Barrierefreiheit 5 04.09.2007 11:29
CSS - Bild im div container überlappt andere container Buschdieb HTML, Usability und Barrierefreiheit 13 19.07.2007 23:17
IE6: Container mit Float dabei wird margin doppelt gewertet DonTermi HTML, Usability und Barrierefreiheit 1 11.01.2007 09:02
Problem mit Container max-dhom HTML, Usability und Barrierefreiheit 3 20.09.2006 11:10
[Erledigt] Dependency/Property Injection Off-Topic Diskussionen 1 18.05.2006 10:52
CSS: Verschachtelter Container und Text danach HTML, Usability und Barrierefreiheit 2 01.12.2005 10:00
[Erledigt] Container im Firefox falsch dargestellt HTML, Usability und Barrierefreiheit 27 15.08.2005 23:18

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php xml di container, php5 container servicedefinition, php dependency injection container, http://www.php.de/php-fortgeschrittene/81162-dependency-injection-container-4.html

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