Quick Start Symfony DI (Sõltuvus Injection) Tutorial
Mis on Sõltuvus Injection (DI)?
Sõltuvus süstimine on tehnika, mis võimaldab lõdvalt seotud objektide tarkvara rakendus. Üldiselt, kui objekt on vaja juurdepääsu funktsioonid teise oleks instantiated sisemiselt viib tihedalt sidestatud süsteemid. Rakendades sõltuvust süsti me Süstida vajalik objektid on kasutusvalmis (mõnikord nimetatakse ka inversioon control - ROK). Võtke järgmine näide:
<? Php klassi DecisionMaker { avaliku funktsiooni makeDecision (massiiv $ parameetrid) { / / Vajad andmebaasi adapter $ Dp = new DecisionParameters (); $ ParameterScore = $ dp-> getScore ($ parameetrid); / * ... Mõned enam otsuseid loogika ... * / return ($ parameterScore> 50); } }
See tükk kood on öelnud, et tihedalt sidestatud, et DecisionParameters objekti. Ümberkirjutamine eespool nõrgalt sidestatud mood me tahaks olla midagi ....
<? Php klassi DecisionMaker {era $ _dp; avaliku funktsiooni __construct ($ dp) {$ this-> _dp = $ dp;} avaliku funktsiooni makeDecision (massiiv $ parameetrid) {$ parameterScore = $ this-> _dp-> getScore ($ parameetrid); / * ... Mõned enam otsuseid loogika ... * / Return ($ parameterScore> 50);}}
Kuigi üha kasu nõrgalt sidestatud kood lisame keerukust selline, et iga kord, eesmärk on instantiated peame ka instantiate tema sõltuvused ja edasi anda liiga. Näiteks see:
$ Valik = new DecisionMaker (); echo $ valik-> makeDecision (array ("püügikoormuse '=>' madal ',' Tagasi '=>' kõrge '));
nüüd on:
$ Dp = new DecisionParameters (); $ Valik = new DecisionMaker ($ dp); echo $ valik-> makeDecision (array ("püügikoormuse '=>' madal ',' Tagasi '=>' kõrge '));
See olukord muutub valulikuks, kui mitu sõltuvused klass on kasvanud ning mis siis, kui sõltuvuste ise sõltuvuste? See võib üsna kiiresti muutuda objekti haldamine õudusunenägu! Enter sõltuvust süsti konteinerite (või raamistike) ...
Sõltuvus Injection konteinerites / raamistike
Sõltuvus süsti konteinerite (või raamistike) käitlema protsessi objekti loomist; instantiating ja süstimise tahes sõltuvuse naasid näiteks helistajale.
Oma koodi asemel luua uusi objekte otse me nõuda koopia objekti DI konteinerisse. Objekti oleme tagasi juba kõik tema sõltuvused süstitud ja objekt on valmis minema.
Symfony Sõltuvus Injection Container
Symfony on ilmselt tuntuim nende täielik korstnat MVC raamistiku aga neil on ka välja mitmeid komponente, mida saab kasutada sõltumatult. Näiteks sõltuvust süsti konteiner me ei kavatse rääkida siin, YAML parser, templating mootori, vaadake Symfony osad rohkem.
Symfony DI konteiner põhineb, et alates Spring raamistiku kohta Java .
Eellaadimisel
Et bootstrap Symfony sõltuvust süsti raamistik me kasutame koodi kirjas allpool. Olen otsustanud kasutada YAML lihtsalt sellepärast, et seda lihtsalt lugeda ja setup. Maksimaalse kiiruse võiksite kirjutada oma konteinerid tavaline PHP (Symfony konteineri saab seda sinu eest, kui setup), või teise cache terve konteiner kasutades Zend_Cache vms.
Kui soovite installida Symfony DI järgige siia http://components.symfony-project.org/dependency-injection/installation ja lisada see oma tee.
/ / Load Symfony DI konteiner nõuavad "sfServiceContainerBuilder.php"; $ Konteiner = new sfServiceContainerBuilder (); $ Laadur = new sfServiceContainerLoaderFileYaml ($ konteiner); $ Laadur-> koormus (APPLICATION_PATH. "/ Config / di / services.yml ');
Esiteks me instantiate uus konteiner ja siis koormus meie seadistuse YAML faili. Märkus: DI konteiner saab laadida config mitmeid vorminguid näiteks XML , YAML, PHP, ning INI *. I kipuvad sisaldama ühte YAML fail ja importida muid faile jooksul seal.
Mitmed konfiguratsioonifailid võib importida kasutades erinevaid formaate, uuema mõisted kirjutada need, mis on juba määratletud. Konfiguratsiooni faili saab lisada viited esemetele ja parameetrid.
* INI on ainult võimalus määratleda parameetreid ja ei saa importida muid faile
Konfiguratsiooni näide
Impordi puhul: - {Ressurss: daos.yml} parameetrid: kasutajanimi: false teenuseid: # Klientide mudel model.customer: klass: Pro_Customer kõne: - [SetLogger, [@ utils.logger]] - [SetDao, [@ data.userdata.mysql]] - [SetUserName [% username%]] # Toote mudel model.product: klass: Pro_Product argumendid: [% username%, {type:% accesslevel% lastlogin:% lastlogin%}] kõne: - [SetDao, [@ data.product.mysql]] # Logija utils.logger: klass: Pro_Logger ehitaja: getInstance kõne: - [SetHandle, [@ utils.filewriter]]
Ma arvan, et ülaltoodud kood on üsna mõistetav, kuid selguse huvides ma seletan iga osa nüüd.
Kohe alguses me defineerime mõned import (st muid faile sõeluda), I like to grupp minu koosseisude näiteks DAOs ühte faili, kommunaalkulud teises ja nimi faili sobivalt. Kuigi natuke aeglasem see kiirendab hooldus konfiguratsioonifailid. Tema ka võimalik sõeluda failide muudes vormides, kasutades eri impordimaksudega lippe. Failid on sõeluda, et uuemate mõistete ülekirjutamist või muudetakse eelnevalt määratletud services / parameetreid.
Järgmine me defineerime parameetri parameeter üldiselt võib iga PHP muutuja tüüp. Sel hetkel ma ei teadnud, mida oma kasutajanime parameeter tuleks (mul on vaja autentida selle eest!), Nii et ma olen määratletud vaikimisi väärtust ja ma kirjutada see väärtus hiljem. Pange tähele, klassid ei ole instantiated kuni te küsite neid nii määratleda parameetreid veidi hiljem on täiesti korras. Pärast seda ma määratleda mõned teenused:
- Instantiate Pro_Customer lähevad näiteks minu puuraidur setLogger () meetod, lisage oma MySQL andmetele juurdepääsu eesmärk (DAO) ja juhitakse kasutajanime samuti. Iga kord, kui ma küsida Selle objekti Ma tahan uut näiteks
- Loo astme Pro_Product lähevad argumendid kasutajanimi ja võimalusi massiivi ehitaja. Pärast instantiation kõne setDao () ja edastada see minu toode DAO
- Anna mulle koopia Pro_Logger, instantiate, kasutades getInstance () meetodit ning juhitakse koopia minu fail kirjanik objekti kaudu setHandle (), kui selle koormatud. Minu faili kirjanik on määratletud üks mu impordist.
Jooksul konfiguratsioonifailid teenuseid osutatakse prepending nime "@" sümbolit, parameetrid on osutada prepending ja lisades koos '%' sümbolid, eg@utils.logger% username%.
Lisades andmed post laadimise
Mõnikord ei tea, mis parameetrite väärtused tuleb enne, kui olete bootstrapped, nagu meie kasutajanime parameeter eespool. Selleks, et kirjutada väärtus offsetSet () meetodit, esiteks läbib parameetri nimi, millele järgneb selle uue väärtuse:
$ Konteiner-> offsetSet ('kasutajanimi', $ kasutajanimi); Getting esemed nõust
Kui setup asemel instantiating objekte otse nüüd minna DI konteiner saada juhtudel. Mis Symfony DI kutsume getService () meetod, läbides string, mis kirjeldab muutuja, mida soovid alla laadida, nt
$ Puuraidur = $ konteiner-> getService ("utils.logger '); See täidab ekvivalent:
$ Puuraidur = Pro_Logger: getInstance (); $ FileWriter = new Pro_Writer_FileWriter (); $ Puuraidur-> setHandler ($ fileWriter);
On võimalik teha kindlaks, kas konteineril on näiteks teenuse helistades hasService () meetod, mis tagastab tõeväärtuse.
Tema ei ole vajalik omada juurdepääsu konteineri kaugemale tipptasemel teie taotluse sest kui allalaadimise näiteks kõiki nõutud sõltuvused õigus kuni madalaima sügavamal oma taotluse juba setup ja ootab kutsutud.
Unit Testing
Sõltuvus süst on ka lisakasu, mis võimaldab objekte katsetatakse isolatsioonis. Võttes DecisionMaker klassi näiteks enne selle rakendamist sõltuvust süsti setup meie testi tulemusi olid ka sõltub rakendamise DecisionParameters klassis.
Kui DecisionParameters klassi edasi erinevaid tulemusi meie katsed võiks alustada vastasel süül meie oma. Kasutades sõltuvuse süsti saame nüüd passi DecisionParameters objekt, mis tagastab teada / määratud kogumi tulemused teatud parameetrid, nüüd katsetamine DecisionMaker eraldi mingeid väliseid tegureid, st kui meie katsed alustada kui see ei ole võimalik otseselt seostada millegagi muutuvad DecisionMakeer klassis. See on eriti oluline peaks teil olema toetudes katseandmeid andmebaasi testimiseks.
Rakenduse seadistused
Kuidas teie taotlusele käitub oma tootmise server paratamatult erinevad oma arengut setup. Näiteks arengukeskkonna tase metsaraie oleks palju täpsem kui oma tootmise süsteem. Muutes oma sõltuvust süsti konteiner konfiguratsioonifailid pisut (või parsing täiendav konfiguratsiooni fail) muuda käitumist sõltuvalt keskkond on tehtud lihtsaks.
Tüübi järgi hinting kohta liidesed asemel realisatsioonid määramisel oma sõltuvusi selle ka võimalik vahetada välja komponendid ühilduvad osad koos paar rida YAML või XML. Näiteks võite praegu oma andmebaasi kaudu MySQL DAO (Data Access Object), kuid aeg võib teil tekkida KPN Zend_Db või doktriin rakendamise DAO. Lisades uue ülevõtmist konfiguratsioonifailis äkki kõik objektid, mida kasutatakse vana MySQL rakendamine on nüüd oma uue rakendamist, ilma et rünnak südamed oma taotluse.
Märgib
- Seades jagatud: tõsi konfiguratsiooni oleme alati anda sama astme objekti. See on väga kasulik, kui tegemist esemetega, mis sisaldavad ressursid nagu andmebaasi ühendused, faili käepidemed jne
- On kaks meetodid, mille abil sõltuvused võib süstida. Üks on edasi sõltuvused koos ehitaja või alternatiivselt kaudu setter meetoditega. Üldtunnustatud muster on läbi vajalikud sõltuvused kaudu ehitaja ja optionals kaudu kujundajad. Minu isiklik eelistus on kasutada koostajate jaoks kõike, kuid seda on näha üksikisiku arendaja
Lõpuks ....
Koos lühikese arutelu sõltuvust süsti ja oma plussid ja miinused see on olnud ka Kiirtutvustus rakendamiseks Symfony Sõltuvus Injection Container ... loodetavasti oled näinud, et see on üllatavalt lihtne ja kiire. Siit saate hakata kasutama sõltuvust süsti teie rakenduse kaudu ja vaata, kasutades palju rohkem lisafunktsioone (kuigi lihtne näide hõlmab enamiku funktsioonide saad nõuda). Nagu alati I punkt teil käsitsi täiendavat infot.


















































[...] See postitus oli mainitud puperdama Vincent Jousse, Steven Lloyd Watkin. Steven Lloyd Watkin ütles: http://bit.ly/cUO2ov Quick start # symfony sõltuvust süsti raamistik # php # ZF [...]
Suurepärane artikkel.
Mul on kahtlus nüüd. Kui eellaadimisel oleme laadimise yaml konfiguratsioonifailid. Nii et ei, et luua objektid kõik, mida me ei vaja?
Sest nt: Mul on klassis midagi, mis on kasutada ainult mõnikord. Nii see loob objekt või on see piisavalt targad, et koormus kaudu automaatne laadimine toimib, kui ma kutsun getInstance () meetod. Ma ei saa, et ehk miks.
Tänu
Ei, klassid on ainult koormatud, kui nad on esmalt vaja.
In getInstance () näiteks klass on instantiated nagu:
$ Class = Klass:: getInstance ();
Selle asemel, et:
$ Class = uus klass ();
Üldiselt kasutatakse seda, kui need rakendavad üksikuid muster.
[...] Lastes teil kasutada DI oma projekti lihtne. Steven Lloyd Watkin veeta oma aega kirjalikult Quick Start tutorial.It väärt mainida, et Symfony DI Container on standalone raamatukogu saadaval Symfony [...]