Quick Start Symfony DI (Injection varësisë) Tutorial

Nga Lloyd Watkin Steven , e shtunë 14 gusht 2010 14:21

Çfarë është Injection Dependency (DI)?

injeksion Dependency është një teknikë që lejon për objektet e shoqëruar lirshëm brenda një software application. Në përgjithësi, nëse një objekt kërkon qasje në funksionalitetin e një tjetër ajo do të jetë instantiated brenda vendit që çon në sistemet e shoqëruar fort. Duke zbatuar injeksion në vartësi të injektuar ne objektet e nevojshme gati për përdorim (nganjëherë referuar edhe përmbysja e kontrollit - IOC). Merrni shembullin e mëposhtëm:

  <? Php
 DecisionMaker klasë {
     makeDecision publik funksion (array parametrat $) {
         / / Nevoja përshtatës bazën e të dhënave
         $ = Dp DecisionParameters reja ();
         $ = ParameterScore getScore $ dp-> ($ parametrat);
         / * ...  Disa logjika më shumë vendim ...  * /
         kthim ($ parameterScore> 50);
     }
 } 

Kjo pjesë e kodit është e thënë të jetë e shoqëruar ngushtë me DecisionParameters objektit. Rishkrimin e mësipërme në një mënyrë të shoqëruar lirshëm ne do të kemi diçka si ....

  <? Php
 DecisionMaker klasë {
     private $ _dp;
     funksionit publik __construct ($ dp) {
         $ This-> _dp = $ dp;
     }
     makeDecision publik funksion (array parametrat $) {
         $ = ParameterScore $ this-> _dp-> getScore ($ parametrat);
         / * ...  Disa logjika më shumë vendim ...  * /
         kthim ($ parameterScore> 50);
     }
 } 

Përderisa fituar të mirat e kodit të shoqëruar lirshëm ne jemi duke shtuar kompleksitetit të tillë që çdo herë që një objekt është instantiated ne gjithashtu duhet të ilustroj me shembull konkret varësi të saj dhe të kalojë këto në shumë. Për shembull, këtë:

  $ = Zgjedhja DecisionMaker reja ();
 echo $ makeDecision zgjedhje-> (array ('përpjekje' => 'të ulët', 'kthim' => 'e lartë')); 

tani bëhet:

  $ = Dp DecisionParameters reja ();
 $ = Zgjedhja DecisionMaker ri ($ dp);
 echo $ makeDecision zgjedhje-> (array ('përpjekje' => 'të ulët', 'kthim' => 'e lartë')); 

Kjo situatë bëhet më e dhimbshme, si numri i varësi për një klasë është rritur, dhe çka nëse varësi vetë kanë varësi? Kjo mund të bëhet shumë shpejt një administratë objekt ankth! Enter kontejnerët injeksion varësisë (ose kornizat) ...

Injeksion kontejnerët Dependency / Kornizat

injeksion kontenierë Dependency (ose kornizat) merret me procesin e krijimit të objektit; instantiating dhe injektuar çdo varësi para se të kthehej në një shembull për të thirrësit.

Në kodin e juaj në vend se të krijuar objekte të reja direkt ne kërkojë një kopje të objektit nga enë DI. Objekti ne jemi të kthyer tashmë i ka të gjitha varësi të saj injektuar dhe objekti është gati për të shkuar.

Symfony Injection Dependency Container

Symfony është ndoshta më i njohur për e tyre të plotë rafte MVC kuadër megjithatë ata kanë lëshuar edhe një numër i komponentëve që mund të përdoren të pavarur. Për shembull, injektimi i varësisë enë ne do të flasim për këtu, një YAML parser, një motor templating, shih komponentet Symfony për më shumë.

Enë DI Symfony është i bazuar në atë nga Korniza PranveraJava .

Bootstrapping

Në mënyrë që të bootstrap injeksion varësisë kuadrin Symfony ne përdorim kodin si përshkruhet më poshtë. Unë kam zgjedhur të përdorin YAML vetëm për shkak se e lehtë për të lexuar dhe setup. Për shpejtësi maksimale ju mund të doni të shkruani nga kontejnerët tuaj të thjeshtë PHP (Symfony enë mund ta bëjë këtë për ju një herë setup), ose ndryshe cache enë të plotë duke përdorur Zend_Cache , ose të ngjashme.

Për të instaluar Symfony DI ndiqni udhëzimet e përfshira këtu http://components.symfony-project.org/dependency-injection/installation , dhe shtoj se në rrugën tuaj.

  / / Load enë DI Symfony
 kërkojnë 'sfServiceContainerBuilder.php';
 $ = Enë sfServiceContainerBuilder reja ();
 $ = Hamall sfServiceContainerLoaderFileYaml ri ($ enë);
 load $ hamall-> (APPLICATION_PATH '/ config / di / services.yml'.); 

Së pari ne ilustroj me shembull konkret një enë të re, dhe pastaj ne load konfigurimin tonë nga një file YAML. Shënim: enë DI mund të ngarkesës config nga disa formate të tilla si XML , YAML, PHP, dhe INI *. Unë synoj që të përfshijë një file të vetëm YAML dhe importit fotografi të tjera nga brenda aty.

Disa fotografi konfigurimit mund të importohet duke përdorur formate të ndryshme, këto përkufizime të reja overwriting ato që tashmë janë përcaktuar. fotografi Konfigurimi mund të përfshijnë referenca të objekteve dhe parametrave.

INI * është vetëm në gjendje të përcaktojë parametrat dhe nuk është në gjendje për të importuar fotografi të tjera

Shembull Konfigurimi

  importet:
 - {Burimeve: daos.yml}

 parametra:
 username: false

 Shërbimet:
 # Model Customer
 model.customer:
 klasë: Pro_Customer
 thirrje:
 - [SetLogger,] [@ utils.logger]
 - [SetDao, [@ data.userdata.mysql]]
       - [SetUserName, [username%%]]

 # Model Produkt
 model.product:
 klasë: Pro_Product
     argumente: [%% username, {type:%% accesslevel, lastlogin:%% lastlogin}]
 thirrje:
 - [SetDao, [@ data.product.mysql]]

 # Logger
 utils.logger:
 klasë: Pro_Logger
     konstruktor: getInstance
 thirrje:
 - [SetHandle,] [@ utils.filewriter] 

Unë mendoj se kodin e mësipërm është mjaft e vetë shpjegues, por për qartësi unë do të shpjegojë çdo pjesë tani.

Së pari ne define disa importe (dmth. fotografi të tjera të bëj analizë gramatikore), mua më pëlqen të grupit konfigurimin e mia për DAOs shembull në një fotografi, shërbimet në një tjetër dhe emrin e file të përshtatshme. Përderisa një pak më ngadalë se ajo po rrit ruajtjen e files e konfigurimit. E tij gjithashtu e mundur që të kuptoj fotografi e formate të tjera duke përdorur flamujve të ndryshme të importit. Fotografi janë të analizohet në mënyrë që me përkufizime të reja overwriting ose ndryshimin e shërbimeve të përcaktuara më parë / parametrave.

Tjetra ne define një parametër, një parametër në përgjithësi mund të çdo lloji e ndryshueshme PHP. Në këtë pikë unë nuk e di se çfarë parametër ime Emri i përdoruesit duhet të jetë (më duhet të vërtetoj për këtë!), Kështu që unë kam përcaktuar një vlerë të paracaktuar dhe unë do të prishësh se vlera më vonë. , Shënim klasat nuk janë instantiated derisa ju të kërkoni për përcaktimin e parametrave të tyre, në mënyrë pak më vonë është përsosmërisht mirë. Pas kësaj unë define disa shërbime:

  1. Ilustroj me shembull konkret Pro_Customer, të kalojë një shembull i logger tim për setLogger () metodë, shtoni në ime MySQL objekt të dhënat e qasjes (DAO), dhe të kalojë në emrin si. Çdo herë që unë kërkoj për këtë objekt Unë dua një shembull të ri
  2. Krijo një shembull i Pro_Product, kalojnë argumentet e username dhe një sërë mundësitë për konstruktor. Pas thirrjes setDao instantiation () dhe të kalojë atë produkt tim DAO
  3. Më jepni një kopje të Pro_Logger, ilustroj me shembull konkret ajo duke përdorur getInstance () metodë dhe të kalojë një kopje e objektit të shkrimtarit tim file nëpërmjet setHandle () një herë ngarkuar të saj. shkrimtari im i file është përcaktuar në një nga importet e mia.

Në kuadër të konfigurimit dosjet e shërbimeve janë të cekura nga prepending emrin me një @ 'simbol', parametrat janë të cekura nga prepending dhe bashkëngjitur me '%' simbolet,% eg@utils.logger emrin%.

Shtimi i të dhënave post loading

Ndonjëherë ju nuk e dini se çfarë vlera e parametrave duhet të jetë deri pas ju keni bootstrapped, si me emrin parametër tonë më lart. Në mënyrë që të prishësh vlerën offsetSet () metodë është përdorur, së pari kalon emrin parametri ndjekur nga vlera e saj të re:

  offsetSet $ ​​enë-> ('username', $ username); 

Getting Objektet nga enë

Pasi setup në vend se instantiating objekte direkt ne tani të shkojnë në enë DI për të marrë raste. Me DI Symfony që ne e quajmë getService () metodë, duke kaluar në një varg i cili përshkruan ndryshore që ju dëshironi të rifitoj, p.sh.

 $ = Sharrëxhi getService $ enë-> ('utils.logger'); 

Kjo do të kryejnë e barabartë me:

  $ = Sharrëxhi Pro_Logger:: getInstance ();
 $ = FileWriter Pro_Writer_FileWriter reja ();
 $-Logger> setHandler ($ fileWriter); 

Është e mundur për të përcaktuar nëse enë ka një shembull të një shërbimi duke e quajtur hasService () metodë, e cila kthen vlerë boolean.

të nevojshme nuk e tij për të kenë qasje në enë përtej nivelit të lartë të aplikimit tuaj që nga një herë retrieving një shembull të gjithë të varësi të kërkuara të drejtë deri në thellësitë më të thella të aplikimit tuaj janë tashmë setup dhe duke pritur që do të quhet.

Njësia Testim

injeksion Dependency gjithashtu ka shtuar dobi të lejuar objekte për t'u testuar në izolim. Duke marrë shembullin e klasës DecisionMaker përpara zbatimin e setup injeksion varësinë test rezultatet tona kanë qenë gjithashtu e varur në zbatimin e klasës DecisionParameters.

Duhet të ndryshme të kthimit të klasës Rezultatet DecisionParameters testet tona mund të fillojnë të dështuar, jo për fajin e vet tonë. Duke përdorur injeksion varësisë ne tani mund të kalojë në një objekt të DecisionParameters e cila kthen një i njohur / fikse të vendosur të rezultateve për parametrat të dhëna të caktuara, ne jemi duke provuar DecisionMaker në izolim nga ndonjë faktorë të jashtëm, dmth nëse testet tona fillojnë duke dështuar kësaj mund t'i atribuohet drejtpërdrejt në diçka ndryshimin në klasë DecisionMakeer. Kjo është veçanërisht e rëndësishme duhet të jetë duke u mbështetur në të dhënat nga një bazë të dhënash provë për testim.

Aplikimi Konfigurimi

Mënyra në të cilën aplikimi juaj sillet në serverin tuaj të prodhimit të pashmangshme do të ndryshojnë nga setup tuaj të zhvillimit. Për shembull, në një mjedis të zhvillimit të nivelit të logging do të jetë shumë më i grimcuar se në sistemin tuaj të prodhimit. Duke i ndryshuar injeksion tuaj varësisë fotografi enë konfigurimit pak (ose parsing një file shtesë konfigurimit) ndryshimin e sjelljes në varësi të mjedisit është bërë thjeshtë.

Sipas llojit të nënkuptuar në kufijtë e më tepër se Implementimi kur ngritjen e varësitë juaj e saj gjithashtu e mundur të bie në ujdi nga komponentet për komponentet në përputhje me disa rreshta të YAML ose XML. Për shembull, ju mund aktualisht të aksesuar databazën tuaj nëpërmjet një DAO MySQL (Data Access Object), por në kohë ju mund të zhvillojë një PDO, Zend_Db, ose Doktrina zbatimin e këtij DAO. Duke shtuar me zbatimin e reja në konfigurimin tuaj skedar papritmas të gjitha objektet që përdoren zbatimin e vjetër MySQL tani janë duke përdorur zbatimin tuaj të re pa nevojë për të sulmuar zorrët e aplikimit tuaj.

Shënime

  • Me vendosjen e përbashkët: në konfigurimin e vërtetë ne jemi të dhënë gjithmonë e shkallës së njëjtë të një objekti. Kjo është shumë e dobishme kur kanë të bëjnë me objekte të cilat përmbajnë burime të tilla si lidhjet bazës së të dhënave, merret me fotografi, etj
  • Ka dy metoda me të cilat varësi mund të injektohet. Njëra është për të kaluar varësi me ndërtuesit, ose ndryshe me anë të metodave të argjendar. Model të pranuara në përgjithësi është e nevojshme për të kaluar varësi nëpërmjet konstruktor dhe optionals nëpërmjet përcaktuesve. Preferenca ime personale është që të përdorin përcaktuesit e për çdo gjë, por kjo është për shkak të zhvilluesi i individit

Më në fund ....

Së bashku me një diskutim të shkurtër mbi injeksion varësinë dhe avantazhet dhe disavantazhet e kjo ka qenë gjithashtu një udhëzues të shpejtë, të fillojë të zbatimin e Container Dependency Symfony Injection ... shpresojmë se ju kam parë se është çuditërisht e shpejtë dhe e lehtë. Nga këtu ju do të jetë në gjendje që të fillojë përdorimin e injektimit të varësisë nëpërmjet aplikimit tuaj dhe të kërkoni për të përdorur më shumë nga veçoritë e përparuara (edhe pse shembull të thjeshtë mbulon shumicën e funksionalitetit ju do të kërkojnë). Si gjithmonë, unë pikë me ju për manual për informacion të mëtejshëm.

4 Responses to "Fillimit të Shpejtë Symfony DI (Injection Dependency) Tutorial"

  1. [...] Ky post është përmendur në Twitter nga Vincent Jousse, Steven Lloyd Watkin. Steven Lloyd Watkin tha: http://bit.ly/cUO2ov të shpejta të fillojë për injeksion në vartësi # Symfony kuadër # # php ZF [...]

  2. Hari KT thotë:

    neni Madhe.
    Unë kam një dyshim tani. Kur bootstrapping ne jemi loading fotografi yaml konfigurimit. Pra, nuk do të krijuar objekte për të gjithë, të cilat ne nuk kemi nevojë?
    Për të psh: Unë kam një Diçka klasë e cila është përdorur vetëm në disa raste. Pra, e bën atë të krijon një objekt apo është mjaft i zgjuar për të ngarkuar me anë të funksioneve autoload kur unë jam duke bërë thirrje getInstance () metodë. Unë nuk e kam marrë atë, dmth pse.

    Faleminderit

  3. Jo, klasat janë të ngarkuar vetëm kur ata janë të detyruar të parë.

    Në getInstance () shembull klasë është instantiated si:
    $ = Klasa klasë:: getInstance ();
    Në vend se:
    $ = Klasë Klasa e re ();
    Në përgjithësi kjo është përdorur gjatë zbatimit të model i vetëm.

  4. [...] Lejuar të përdorni DI në projektin tuaj në një mënyrë të lehtë. Steven Lloyd Watkin kalojnë kohën e tij për hartimin e një tutorial.It të shpejtë të fillojë e vlefshme të përmendet se Symfony DI Container është një bibliotekë të pavarur në dispozicion si një [...] Symfony

Leave a Reply













Theme Panorama nga Themocracy

8 vizitorë online tani
4 vizitore, 4 bots, 0 anëtarë
Max vizitorët sot: 17 në orën 09:40 UTC
Këtë muaj: 26 at 2011/07/05 12:35 UTC
Këtë vit: 130 në 10:40 UTC 28-03-2011
Gjithsej: 130 në 10:40 UTC 28-03-2011