Quick Start Symfony DI (Dependency Injection) Tutorial
Hvað er Dependency Injection (DI)?
Yfirráðasvæði innspýting er tækni sem gerir ráð fyrir lauslega ásamt hlutum innan hugbúnaðar. Almennt ef mótmæla þarf aðgang að virkni annars væri að smíða innbyrðis sem leiðir til vel ásamt kerfi. Með því að innleiða ánauðar innspýting við sprauta þarf hlutir tilbúin til notkunar (stundum einnig nefnt inversion böndunum - IOC). Taka eftirfarandi dæmi:
<? PHP bekk DecisionMaker { opinbera virka makeDecision (array $ breytur) { / / Vantar gagnagrunn millistykki $ DP = new DecisionParameters (); $ ParameterScore = $ DP-> getScore ($ breytur); / * ... Sumir fleiri ákvörðun rökfræði ... * / aftur ($ parameterScore> 50); } }
Þetta stykki af kóða er sagður vera þétt saman að DecisionParameters hlut. Endurskrifa ofan í lauslega ásamt tísku við myndum hafa eitthvað eins og ....
<? PHP bekk DecisionMaker { einka $ _dp; opinbera virka __construct ($ DP) { $ This-> _dp = $ DP; } opinbera virka makeDecision (array $ breytur) { $ ParameterScore = $ this-> _dp-> getScore ($ breytur); / * ... Sumir fleiri ákvörðun rökfræði ... * / aftur ($ parameterScore> 50); } }
Þó að öðlast ávinning af lauslega saman kóða sem við erum að bæta flókin þannig að hvert skipti sem hlutur er smíða við verðum einnig að ræst ósjálfstæði og standast þessar í líka. Til dæmis þetta:
$ Val = new DecisionMaker (); echo $ val-> makeDecision (array ('átak' => 'lágt', 'Return' => 'hár'));
Nú verður því:
$ DP = new DecisionParameters (); $ Val = new DecisionMaker ($ DP); echo $ val-> makeDecision (array ('átak' => 'lágt', 'Return' => 'hár'));
Þetta ástand verður meira sársaukafullt eins fjölda af ósjálfstæði fyrir flokk hækkar, og hvað ef kröfur sig hafa ósjálfstæði? Þetta getur alveg fljótt orðið að gjöf hlut martröð! Sláðu háð inndælingu gáma (eða ramma) ...
Dependency Injection gáma / Ramma
Yfirráðasvæði innspýting ílát (eða ramma) séð um ferlið sköpun mótmæla; instantiating og dæla einhverju kröfur áður en aftur dæmi til þess sem hringir.
Í númerið þitt frekar en að búa til nýja hluti beint við beiðni eintak af hlutnum úr DI gámur. Hlutnum sem við erum aftur nú þegar hefur alla ósjálfstæði að ræða og að mótmæla er tilbúinn að fara.
Symfony Dependency Injection Container
Symfony er sennilega best þekktur fyrir að stafla þeirra full MVC ramma þó þeir hafa einnig gefið út fjölda af efnisþáttum sem hægt er að nota sjálfstætt. Td innspýting ánauðar gámur við erum að fara að tala um hér, YAML , a sniðmát vél, sjá flokka Symfony íhlutum fyrir fleiri.
The Symfony DI gámur er byggt á að frá Spring Framework í Java .
Bootstrapping
Til þess að ræsi á Symfony ánauðar innspýting ramma sem við notum númer sem eru hér fyrir neðan. Ég hef valið að nota YAML bara því auðvelt að lesa og skipulag. Fyrir hámarks hraða sem þú vilt kannski að skrifa út gámum til látlaus PHP (á Symfony gámur getur gert þetta fyrir þig einu sinni skipulag), eða að öðrum kosti skyndiminni allt íláti með Zend_Cache , eða álíka.
Til að setja Symfony DI fylgja leiðbeiningunum fylgir hér http://components.symfony-project.org/dependency-injection/installation , og bæta því við vegi þínum.
/ / Hlaða Symfony DI gámur þurfa 'sfServiceContainerBuilder.php'; $ Gámur = new sfServiceContainerBuilder (); $ Loader = new sfServiceContainerLoaderFileYaml ($ gámur); $ Loader-> álag (APPLICATION_PATH '/ config / di / services.yml'.);
Í fyrsta lagi við ræst er nýr gámur, og þá við hlöðum stillingar okkar úr YAML-skrá. Athugið: DI íláti getur hlaða config frá nokkrum snið svo sem XML , YAML, PHP, og INI *. ÉG hafa tilhneigingu til að fela einni YAML-skrá og flytja aðrar skrár innan frá þar.
Nokkrar skrár stillingar hægt er að flytja með mismunandi sniði, nýrri skilgreiningar skrifa yfir þá sem þegar hafa verið skilgreindar. Uppsetningarskrár getur innihaldið tilvísanir til mótmæla og breytum.
INI * er aðeins hægt að skilgreina breytur og er ófær um að flytja aðrar skrár
Configuration Dæmi
innflutningur: - {Auðlind: daos.yml} breytur: notandanafn: false þjónusta: # Customer fyrirmynd model.customer: flokkur: Pro_Customer símtöl: - [SetLogger, [@ utils.logger]] - [SetDao, [@ data.userdata.mysql]] - [SetUserName, [% notandanafn%]] # Vörumódel model.product: flokkur: Pro_Product rök: [% notandanafn% {ferðar:% accesslevel% lastlogin:% lastlogin%}] símtöl: - [SetDao, [@ data.product.mysql]] # Skógarhöggsmaður utils.logger: flokkur: Pro_Logger framkvæmdaaðila: getInstance símtöl: - [SetHandle, [@ utils.filewriter]]
Ég held að kóðann hér að ofan er nokkuð sjáfur en fyrir skýrleika ég skal útskýra hvers hluta núna.
Fyrst burt við skilgreinum nokkur innflutningur (þ.e. aðrar skrár til að flokka), eins og ég við hóp stillingar minn fyrir DAOs td í einni skrá, tólum í öðru og nafn the skrá á viðeigandi hátt. Þó svolítið hægar það flýtir fyrir viðhald stillingar skrá. Þess er einnig hægt að flokka skrár á öðrum sniðum með því að nota mismunandi fánar innflutningur. Skrár eru óþekkt í röð með nýrri skilgreiningar skrifa of mikið eða breyta áður skilgreinda þjónustu / viðföng.
Næst ætlum við að skilgreina breytu, viðfang get yfirleitt vera allir PHP breytileg tegund. Á þessum tímapunkti vissi ég ekki hvað notendanafnið breytu minn ætti að vera (ég þarf að fullgilda fyrir því!), Svo ég hef skilgreint sjálfgefið gildi og ég ætla að skrifa það gildi síðar. Ath, flokkar eru ekki instantiated þar til þú biður um þá sem skilgreina svo breytum litlu seinna er fullkomlega í lagi. Eftir þetta ég skilgreina einhverja þjónustu:
- Ræst Pro_Customer, framhjá dæmi af skógarhöggsmaður mínum til setLogger () aðferð, setja í minn MySQL gögn aðgangur hlut (DAO), og fara í notendanafn eins og heilbrigður. Hvert skipti sem ég spyr um þetta hlut sem ég vil nýtt eintak
- Búa til dæmi af Pro_Product, fara röksemdir notandanafn og valkosti fylki til framkvæmdaaðila. Eftir instantiation kalla setDao () og gefa það vara minn DAO
- Gefðu mér afrit af Pro_Logger, ræst hana með getInstance () aðferð og standast afrit af skrá rithöfundur mótmæla mitt í gegnum setHandle () einu sinni hlaðinn þess. skrá rithöfundur minn er skilgreint í einu af innflutningi mínum.
Innan stillingar skrá þjónusta er vísað af prepending nafn með @ 'tákn' eru breytur vísa prepending og auka við með '%' tákn, eg@utils.logger% notandanafn%.
Bæti gögnum eftir fermingu
Stundum þú veist ekki hvað verðmæti breytur ættu að vera fyrr en eftir að þú hefur bootstrapped, eins og með breytu okkar notandanafn hér fyrir ofan. Til að skrifa gildið sem offsetSet () aðferð er notuð í fyrsta lagi liggur breytu nafninu eftir gildi þess nýja:
$ GÃ> offsetSet ('notandanafn', $ username); Getting Objects af Container
Þegar skipulag fremur en instantiating mótmæla beint við förum nú að DI ílát til að fá dæmi. Með Symfony DI við köllum getService () aðferð, sem liggur í streng sem lýsir breytu sem þú vilt sækja, td
$ Skógarhöggsmaður = $ gÃ> getService ('utils.logger'); Þetta mun koma fram sem nemur:
$ Skógarhöggsmaður = Pro_Logger:: getInstance (); $ FileWriter = new Pro_Writer_FileWriter (); $ Skógarhöggsmaður-> setHandler ($ fileWriter);
Það er hægt að ákvarða hvort gámur er dæmi af þjónustu með því að hringja í hasService () aðferð, sem skilar Boolean gildi.
þarf þess ekki að hafa aðgang að ílát utan á efsta þrep umsóknar síðan einu sinni sækja dæmi allar nauðsynlegar kröfur rétt ofan við dýpstu dýpi á umsókn þinni eru þegar skipulag og þráir að vera gestur.
Unit Testing
Yfirráðasvæði innspýting hefur einnig bætt hag að leyfa hlutum til að prófa í einangrun. Taka DecisionMaker bekknum td fyrir framkvæmd innspýting ánauðar skipulag niðurstöður okkar próf var einnig háð framkvæmd DecisionParameters bekknum.
Ætti DecisionParameters bekknum aftur mismunandi niðurstöður prófana okkar gat byrjað að öðrum kosti í gegnum neitun galli af okkar eigin. Using ánauðar innspýting getum við nú fara í DecisionParameters hlut sem skilar þekkt / fast setja niðurstöður fyrir ákveðnum þáttum inntak, við erum nú að prófa DecisionMaker í einangrun frá utanaðkomandi þátta, þ.e. ef prófanir okkar byrja að öðrum kosti má beint rekja til eitthvað breytast í DecisionMakeer bekknum. Þetta er sérstaklega mikilvægt ættir þú að treysta á niðurstöðum rannsókna úr gagnagrunni til að prófa.
Umsókn Stillingar
Leiðin sem umsókn þín hegðar sér á vefþjóninum framleiðslu munu óhjákvæmilega mismunandi frá uppsetningu þroska þinn. Til dæmis, í þróun umhverfi stigi að skrá þig inn væri miklu nákvæmari en á vélinni framleiðslunni. Með því að breyta ánauðar innspýting gámur þinn uppsetningarskrár örlítið (eða þáttun til viðbótar stillingaskrá) að breyta hegðun eftir á umhverfið er einfalt.
Eftir tegund vísbending á tengi fremur en gerð þegar ákveðinn ósjálfstæði þínu þess einnig hægt að skipta út íhlutum fyrir samhæfa hluti með nokkrar línur YAML eða XML. Til dæmis getur þú nú aðgang að gagnagrunninum í gegnum MySQL DAO (Data Access Object), en í tíma og þú getur komið PDO, Zend_Db, eða kenningin framkvæmd þessarar DAO. Með því að bæta við nýjum framkvæmd í stillingum þínum skrá skyndilega alla hlutina sem notað gömlu MySQL útfærslu er nú að nota nýja framkvæmd án þess að þurfa að ráðast í djúpum umsókn þína.
Skýringar
- Með því að setja hluti: sannur í uppsetningu sem við erum alltaf að fá sömu dæmi um hlut. Þetta er mjög gagnlegt þegar takast á við hluti sem innihalda efni eins og tengingar gagnagrunninum, skrá handföng, etc
- Það eru tvær aðferðir sem hægt er að ósjálfstæði sprautað. Eitt er að standast kröfur við framkvæmdaaðila, eða að öðrum kosti um aðferðir fuglahundur. Almennt viðurkennt mynstur er að standast þurfa kröfur um framkvæmdaaðila og optionals gegnum setters. persónulegt val mitt er að nota setters fyrir allt, en þetta er niður til einstakra framkvæmdaraðila
Loksins ....
Ásamt stuttri umfjöllun um innspýting ánauðar og kosti og galla þetta hefur einnig verið fljótur-byrja leiðarvísir fyrir framkvæmd Symfony Dependency Injection Container ... vonandi að þú hafir séð að það er furðu fljótlegt og auðvelt. Héðan þú munt geta byrjað að nota háð inndælingu með umsókn þína og útlit til að nota margar fleiri háþróaður lögun (þó einfalt dæmi nær langflest af virkni sem þú munt þurfa). Eins og alltaf ég benda þér á handbók fyrir frekari upplýsingar.


















































[...] Þessi færsla var minnst á Twitter eftir Vincent Jousse, Steven Lloyd Watkin. Steven Lloyd Watkin sagði: http://bit.ly/cUO2ov Stuttar fyrir # Symfony háð inndælingu ramma # PHP # ZF [...]
Mikill hlutur.
Ég efa nú. Þegar bootstrapping við erum að hlaða yaml skrá stillingu. Svo er að búa til hluti fyrir alla, sem við þurfum ekki?
Fyrir td: Ég er með bekknum Eitthvað sem er aðeins notaður stundum. Svo er það skapar hlut eða það er sviði nógur til að hlaða í gegnum autoload virka þegar ég er að hringja getInstance () aðferð. Ég vissi ekki að fá að, þ.e. hvers vegna.
Takk
Nei, eru flokkar aðeins hlaðinn þegar þau eru fyrst krafist.
Í getInstance () td í bekknum er smíða eins og:
$ Class = Class:: getInstance ();
Frekar en:
$ Bekknum = new Class ();
Almennt þetta er notað þegar innleiða á Singleton mynstrið.
[...] Láta þig nota DI í verkefni á auðveldan hátt. Steven Lloyd Watkin eyða tíma sínum í að skrifa Stuttar tutorial.It er þess virði að nefna að Symfony DI Container er standalone bókasafn í boði eins og Symfony [...]