Quick Start Symfony DI (Injezzjoni Dipendenza) Tutorial

Permezz Watkin Lloyd Steven , is-Sibt 14 Awi 2010 14:21

X'inhu l-injezzjoni Dipendenza (DI)?

injezzjoni Dipendenza hija teknika li tippermetti għal oġġetti laxk flimkien fi applikazzjoni ta 'softwer. Ġeneralment jekk oġġett jeħtieġ aċċess għall-funzjonalità tal ieħor ikun instantiated internament li jwasslu għal sistemi marsus flimkien. Bl-implimentazzjoni injezzjoni dipendenza aħna tinjetta l-oġġetti meħtieġa lesti għal użu (xi kultant imsejħa wkoll l-inverżjoni ta 'kontroll - IOC). Ħu l-eżempju li ġej:

  <? PHP
 DecisionMaker klassi {
     pubbliku funzjoni makeDecision (array parametri $) {
         / / Ħtieġa l-adapter database
         dp DecisionParameters $ = ġdid ();
         $ ParameterScore = getScore $ dp-> ($ parametri);
         / * ...  Xi aktar loġika deċiżjoni ...  * /
         ritorn ($ parameterScore> 50);
     }
 } 

Din il-biċċa tal-kodiċi huwa qal li jkun sewwa akkoppjat għall-DecisionParameters oġġett. Kitba mill-ġdid ta 'hawn fuq b'mod laxk flimkien we'd jkollhom xi ħaġa bħal ....

 <? PHP klassi DecisionMaker {privati ​​$ _dp; funzjoni pubblika __construct ($ dp) {$ dan il-> _dp = $ dp;} pubbliku funzjoni makeDecision (array $ parametri) {$ parameterScore = $ dan getScore-> _dp-> ($ parametri); / * ...  Xi aktar loġika deċiżjoni ...  * / Ritorn ($ parameterScore> 50);}} 

Filwaqt li jiksbu l-benefiċċji tal-kodiċi laxk flimkien aħna żżid tali komplessità li kull darba l-oġġett huwa instantiated irridu wkoll instantiate dipendenzi tagħha u jgħaddu dawn fl wisq. Per eżempju, dan:

  $ Għażla = DecisionMaker ġodda ();
 eku makeDecision $-għażla> (array ("l-isforz" => "baxxa", "ritorn" => "għolja")); 

issa ssir:

  dp DecisionParameters $ = ġdid ();
 $ Għażla = DecisionMaker ġodda ($ dp);
 eku makeDecision $-għażla> (array ("l-isforz" => "baxxa", "ritorn" => "għolja")); 

Din is-sitwazzjoni ssir iktar diffiċli bħala n-numru tad-dipendenzi għal klassi tiżdied, u jekk dak l-dipendenzi nfushom dipendenzi? Dan jista 'pjuttost malajr sar ħmarillejl amministrazzjoni oġġett! Ikteb kontenituri injezzjoni dipendenza (jew oqsfa) ...

Dipendenza Kontenituri injezzjoni / Oqfsa

Dipendenza kontenituri injezzjoni (jew oqfsa) jimmaniġġaw il-proċess ta 'ħolqien oġġett; instantiating u tinjetta kwalunkwe dipendenzi qabel ma' jirritornaw istanza għall-sejjieħ.

Fil-kodiċi tiegħek aktar milli joħolqu oġġetti ġodda direttament aħna titlob kopja ta 'l-oġġett mill-kontenitur DI. L-għan aħna lura diġà għandu l-dipendenzi tagħha injettata u l-oġġett hija lesta li tmur.

Symfony Dipendenza Injezzjoni Container

Symfony huwa probabbilment l-aħjar magħrufa għall sħiħa tagħhom munzell MVC qafas madankollu huma għandhom ukoll rilaxxati numru tal-komponenti li jistgħu jintużaw b'mod indipendenti. Per eżempju, il-kontenitur injezzjoni dipendenza aħna qed tmur biex jitkellmu dwar hawn, YAML parser, magna templating, ara komponenti Symfony għal aktar.

Il-kontenitur DI Symfony hija bbażata fuq dik mill- Qafas tar-Rebbiegħa fl- Java .

Bootstrapping

Sabiex bootstrap id-dipendenza Symfony injezzjoni qafas nużaw kodiċi kif inkluż hawn taħt. I għażlu li jużaw YAML biss minħabba faċli tagħha biex jinqara u s-setup. Għall-veloċità massima trid int tkun tista tikteb l-kontenituri tiegħek biex sempliċi PHP (il-kontenitur Symfony tista 'tagħmel dan għalik darba setup), jew alternattivament cache-kontenitur sħiħ billi jintużaw Zend_Cache , jew simili.

Biex tinstalla Symfony DI segwi l-istruzzjonijiet inklużi hawnhekk http://components.symfony-project.org/dependency-injection/installation , u iżżidhiex mal-triq tiegħek.

  / / Tagħbija-kontenitur DI Symfony
 jirrikjedu "sfServiceContainerBuilder.php";
 $ Kontenitur = sfServiceContainerBuilder ġodda ();
 $ Loader = sfServiceContainerLoaderFileYaml ġodda ($ kontenitur);
 tagħbija $ loader-> (APPLICATION_PATH "/ konfigurazzjoni / di / services.yml".); 

L-ewwelnett aħna instantiate kontenitur ġdid, u allura aħna tagħbija konfigurazzjoni tagħna minn fajl YAML. Nota: il-kontenitur DI jista 'tagħbija konfigurazzjoni mill-formati diversi bħall- XML , YAML, PHP, u INI *. I-tendenza li jinkludu fajl YAML waħdieni u l-importazzjoni fajls oħra minn ġewwa hemm.

fajls konfigurazzjoni Diversi jistgħu jiġu importati bl-użu ta 'formati differenti, id-definizzjonijiet ġodda kitba fuq dawk li diġà ġew definiti. fajls Konfigurazzjoni jistgħu jinkludu referenzi għal oġġetti u l-parametri.

INI * hija biss kapaċi li jiddefinixxu l-parametri u ma jkunx jista 'importazzjoni fajls oħra

Eżempju Konfigurazzjoni

  importazzjonijiet:
 - {Riżorsa: daos.yml}

 parametri:
 username: foloz

 servizzi:
 # Mudell Customer
 model.customer:
 klassi: Pro_Customer
 jitlob:
 - [SetLogger, [@] utils.logger]
 - [SetDao, [@ data.userdata.mysql]]
       - [SetUserName, [% username%]]

 # Mudell tal-Prodott
 model.product:
 klassi: Pro_Product
     argumenti: [% username%, {tip:%% accesslevel, lastlogin:% lastlogin%}]
 jitlob:
 - [SetDao, [@ data.product.mysql]]

 # Logger
 utils.logger:
 klassi: Pro_Logger
     kostruttur: getInstance
 jitlob:
 - [SetHandle, [@] utils.filewriter] 

Naħseb li l-kodiċi hawn fuq huwa pjuttost awto spjegazzjoni iżda għaċ-ċarezza I'll jispjegaw kull parti issa.

First off niddefinixxu xi importazzjonijiet (jiġifieri fajls oħra biex parse), I simili għall-grupp konfigurazzjonijiet tiegħi għal DAOs eżempju f'fajl wieħed, utilitajiet ieħor u isem tal-fajl xieraq. Filwaqt li ftit aktar bil-mod tħaffef l-manutenzjoni tal-fajls konfigurazzjoni. Tagħha wkoll possibbli li parse fajls ta 'formats oħra li jużaw bnadar ta' importazzjoni differenti. Fajls huma parsed sabiex ma 'definizzjonijiet ġodda kitba jew temenda servizzi li qabel kienu definiti / parametri.

Li jmiss niddefinixxu parametru, parametru jista 'ġeneralment kull tip varjabbli PHP. Fuq dan il-punt ma kontx naf liema parametru username tiegħi għandu jkun (I ħtieġa li jawtentikaw għal dak!), Hekk stajt definit valur ta 'default u I'll jissostitwixxu dak il-valur aktar tard. , Klassijiet Nota mhumiex instantiated sakemm inti titlob għalihom biex jiddefinixxu parametri ftit aktar tard huwa perfettament multa. Wara din I jiddefinixxu ċerti servizzi:

  1. Instantiate Pro_Customer, jgħaddu każ ta 'logger tiegħi għall-setLogger () metodu, żid f'din tiegħi MySQL oġġett aċċess għad-data (DAO), u għaddi fil-username ukoll. Kull darba I ask for dan l-oġġett Irrid każ ġdid
  2. Oħloq każ ta 'Pro_Product, jgħaddu argumenti tal-username u l-firxa għażliet għall-kostruttur. Wara setDao sejħa istanzazzjoni () u tgħaddih prodott tiegħi DAO
  3. Agħti me kopja ta 'Pro_Logger, instantiate billi tuża l-getInstance () metodu u jgħaddu kopja ta' oġġett tiegħi kittieb fajl permezz setHandle () darba mgħobbija tagħha. kittieb fajl tiegħi huwa definit fl waħda ta 'importazzjonijiet tiegħi.

Fi ħdan il-konfigurazzjoni servizzi fajls huma referenzjati mill prepending l-isem bi @ "simbolu", parametri huma referenzjati mill prepending u jpoġġu ma '"%" simboli,%% username eg@utils.logger.

data Żieda post tat-tagħbija

Kultant ma tafx x'inhu l-valur tal-parametri għandhom ikunu sa wara ikollok bootstrapped, kif ma 'parametru username tagħna hawn fuq. Sabiex jissostitwixxu l-valur tal-offsetSet () metodu tkun użata, l-ewwel tgħaddi l-isem segwit mill-parametru valur il-ġdid tiegħu:

  offsetSet $ ​​kontenitur-> ("username", $ username); 

Jkollna Oġġetti mill-kontenitur

Ladarba s-setup minflok instantiating oġġetti direttament aħna issa tmur għall-kontenitur DI biex tikseb istanzi. Bl-DI Symfony nsejħu l-getService () metodu, li jgħaddi string li jiddeskrivi l-varjabbli li tixtieq tkun irkuprata, eż

  $ Logger = getService $ kontenitur-> ('utils.logger "); 

Dan se jwettqu l-ekwivalenti ta ':

  $ Logger = Pro_Logger:: getInstance ();
 $ FileWriter = Pro_Writer_FileWriter ġodda ();
 $-Logger> setHandler ($ fileWriter); 

Huwa possibbli li jiddeterminaw jekk il-kontenitur għandu eżempju ta 'servizz billi ċċempel il-hasService () metodu, li jirritorna valur Boolean.

meħtieġa tagħha li ma jkollhom aċċess għall-kontejner lil hinn mill-ogħla livell ta 'l-applikazzjoni tiegħek peress li ladarba l-irkupru istanza kollha ta' l-dipendenzi meħtieġ id-dritt sal-fond fonda tal-applikazzjoni tiegħek diġà huma setup u qed jistennew li tiġi msejħa.

Unità Ittestjar

injezzjoni Dipendenza wkoll il-benefiċċju miżjud ta 'tippermetti oġġetti li għandhom jiġu ttestjati b'mod iżolat. Filwaqt li l-eżempju klassi DecisionMaker qabel ma timplimenta l-setup injezzjoni dipendenza riżultati tat-testijiet tagħna kienu wkoll dipendenti fuq l-implimentazzjoni tal-klassi DecisionParameters.

Jekk il-klassi differenti ritorn riżultati DecisionParameters testijiet tagħna tista 'tibda fin-nuqqas bl-ebda tort tagħna stess. Bl-użu injezzjoni dipendenza nistgħu issa tgħaddi f'oġġett DecisionParameters li jirritorna magħruf / fiss sett ta 'riżultati għall-parametri ta' input ċerti, aħna issa ittestjar DecisionMaker b'mod iżolat minn xi fatturi esterni, jiġifieri jekk it-testijiet tagħna jibdew nuqqas ta 'dan jistgħu jiġu attribwiti għal xi ħaġa jinbidlu fil-klassi DecisionMakeer. Dan huwa partikolarment importanti jekk inti tkun torbot fuq informazzjoni tat-test minn database għall-ittestjar.

Applikazzjoni Konfigurazzjoni

Il-mod kif iġib ruħu l-applikazzjoni tiegħek fuq is-server produzzjoni tiegħek inevitabbilment se jvarjaw mill-setup iżvilupp tiegħek. Per eżempju, f'ambjent-iżvilupp tal-livell ta 'qtugħ ikun ferm iktar granulari milli fuq sistema ta' produzzjoni tiegħek. Billi jbiddlu fajls tiegħek dipendenza injezzjoni konfigurazzjoni kontenitur ftit (jew parsing fajl konfigurazzjoni addizzjonali) it-tibdil ta 'mġiba li jiddependu fuq l-ambjent huwa magħmul sempliċi.

Skond it-tip ssemmi dwar interfaces aktar milli implimentazzjonijiet meta jiġu stabbiliti d-dipendenzi tagħha tiegħek possibbli wkoll li l-tpartit komponenti għal komponenti kompatibbli ma 'ftit linji ta' YAML jew XML. Per eżempju, inti tista 'attwalment aċċess għal database tiegħek permezz ta' DAO MySQL (Data Aċċess Object), iżda fil-ħin tista 'tiżviluppa DOP, Zend_Db, jew Duttrina implimentazzjoni ta 'dan DAO. Billi żżid l-implimentazzjoni l-ġdida fil-konfigurazzjoni tiegħek fajl f'daqqa l-oġġetti kollha li uża l-implimentazzjoni MySQL qodma huma issa qegħdin jużaw l-implimentazzjoni l-ġdida tiegħek mingħajr il-bżonn li tattakka l-imsaren ta 'l-applikazzjoni tiegħek.

Noti

  • Permezz tat-twaqqif maqsuma: veru fil-konfigurazzjoni aħna dejjem mogħti l-istess istanza ta 'oġġett. Dan huwa utli ħafna meta jittrattaw ma 'oġġetti li fihom ir-riżorsi bħal konnessjonijiet database, fajl manki, eċċ
  • Hemm żewġ metodi li permezz tagħhom dipendenzi jista 'jiġi injettat. Wieħed huwa li jgħaddu dipendenzi mal-kostruttur, jew alternattivament permezz ta 'metodi stabbilzzar. Il-mudell ġeneralment aċċettati huwa li jgħaddi dipendenzi meħtieġa permezz tal-kostruttur u optionals permezz istandards tal-kontabilità. preferenza personali tiegħi huwa li tuża dawk li jistabbilixxu għal kollox, iżda dan huwa jistabbilixxi li l-iżviluppatur individwali

Fl-aħħarnett ....

Flimkien ma 'diskussjoni qasira dwar injezzjoni dipendenza u l-vantaġġi u żvantaġġi dan ġie wkoll gwida jistgħu jibdew malajr għall-implimentazzjoni tal Symfony Dipendenza Injezzjoni Container ... nisperaw li int stajt tidher li hija sorprendentement malajr u faċli. Minn hawn inti ser tkun tista 'tibda tuża injezzjoni dipendenza permezz ta' applikazzjoni tiegħek u tfittex li jużaw ħafna aktar mill-karatteristiċi avvanzati (għalkemm l-eżempju sempliċi jkopri l-maġġoranza vasta ta 'funzjonalità tkun taf teħtieġ). Kif dejjem I punt li inti l- manwal għal aktar informazzjoni.

4 Responses to "Quick Start Symfony DI (Injezzjoni Dipendenza) Tutorial"

  1. [...] Dan il-post kienet imsemmija fuq Twitter minn Vincent Jousse, Steven Lloyd Watkin. Steven Lloyd Watkin qal: http://bit.ly/cUO2ov Quick start għall # Symfony qafas injezzjoni dipendenza # # php zf [...]

  2. Hari KT says:

    Great artikolu.
    I jkollhom dubju issa. Meta bootstrapping aħna tagħbija tal-fajls konfigurazzjoni yaml. Allura dan joħolqu oġġetti għal kulħadd, li ma kellniex bżonn?
    Pereżempju: I jkollhom Haga klassi li jintuża biss xi kultant. Allura ma toħloq oġġett jew hija intelliġenti biżżejjed biex tagħbija permezz ta 'funzjonijiet autoload meta nċempel getInstance () metodu. Jien ma jiksbu li, jiġifieri għaliex.

    Grazzi

  3. Le, klassijiet huma biss mgħobbija meta jkunu ewwel meħtieġa.

    Fil-getInstance () pereżempju l-klassi hija instantiated simili:
    $ = Klassi Klassi:: getInstance ();
    Pjuttost milli:
    $ Klassi = Klassi ġdida, Klassi ();
    Ġeneralment din tkun użata meta jimplimentaw il-mudell singleton.

  4. [...] Kiri tuża DI fil-proġett tiegħek b'mod faċli. Steven Lloyd Watkin jqattgħu ħin tiegħu fuq kitba ta 'tutorial.It quick start "i tajjeb li jissemma li Symfony DI Container hija librerija disponibbli standalone bħala [...] Symfony

Leave a Reply













Tema Panorama minn Themocracy

8 viżitaturi online issa
5 mistednin, 3 bots, 0 membri
viżitaturi llum Max: 17 fuq 00:28 UTC
Dan ix-xahar: 26 fil 2011/07/05 12:35 UTC
Din is-sena: pm UTC 130 fil 28-03-2011 10:40
Il-ħin kollu: pm UTC 130 fil 28-03-2011 10:40