autobuz de comandă (comandă de autobuz)

autobuz de comandă în Laravel - un mod convenabil de a îngloba (izola) sarcinile de aplicare într-o „echipă“ simplu și ușor de înțeles. Pentru a înțelege numirea echipelor, să ne imaginăm că noi scriem o aplicație în care ne vindem utilizatorilor noștri podcast-uri.







Atunci când un utilizator achiziționează un podcast, trebuie să facem câteva acțiuni pe care trebuie să-și retragă banii de pe cardul său, adăugați o intrare în baza de date care a avut loc achiziționarea cu succes și trimite un e-mail cu dovada de cumpărare. Poate chiar trebuie să efectueze un număr redus de controale - și dacă utilizatorul are voie să facă pentru a cumpăra acest podcast special.

De obicei, vom plasa toate această logică în controller, cu toate acestea, această abordare are mai multe dezavantaje. În primul rând, clasa controller conține de obicei mai multe metode pentru procesarea cererilor HTTP-și logica de poziționare în fiecare metodă vom face controlere prea mari, greu de citit și greu de întreținut. În al doilea rând, codul este dificil de utilizat în contextul controlerului și HTTP-cerere (de exemplu, dacă vrem să efectueze achiziționarea de podcast-uri din linia de comandă, sau coada de așteptare). În al treilea rând, este dificil de a testa, pentru că trebuie să imite HTTP-cererea și analiza HTTP-răspuns.

Prin urmare, în loc de a pune această logică în controller, vom aranja într-o așa-numită comandă și numesc PurchasePodcast.

team building

Creați o echipă cu ajutorul artizan-team face: comanda:

Creat de această comandă este plasat în clasa app dosar / Comenzi. În mod implicit, comanda conține două metode - metoda de constructor și mâner. Cu ajutorul designerului, puteți adăuga dependențele necesare în clasa echipa, si ocupa metoda se executa comanda. De exemplu:

Metoda de mâner, de asemenea, poate lua în funcție de argumentele (de tip hinting), precum și de designer. Ca designer, acestea vor fi aplicate automat la intrarea folosind containerul IoC.

executie comanda

Am creat o echipă, este acum rula? Desigur, ne putem îndeplini metoda noastră mânerul unei clase, dar este mai bine să-l rulați din magistrala de comandă Laravel. Cu privire la avantajele acestei abordări vor fi discutate mai jos.

Dacă te uiți la controlerul de bază a aplicației, care se extind în propriul controler, veți vedea acolo trăsătură DispatchesCommands. Această trăsătură vă permite să rulați comenzi folosind metoda de expediere. De exemplu:







Comanda execută magistrala de comandă și preia întreaga rutină pentru a asigura echipa de clasă cu toate dependențele necesare enumerate în argumentul la argumentele constructorului și mânerul metoda.

Puteți utiliza magistrala de comandă în oricare din clasa ta - pentru a adăuga trăsătură Illuminate \ Fundația \ Bus \ DispatchesCommands. Dacă doriți să luați instanța de autobuz de comandă în constructor, specificați argumentele (de tip indiciu) Iluminați obiect \ Contractelor \ Bus \ Dispecer. Și, în sfârșit, puteți utiliza pur și simplu fațada de autobuz pentru a rula comanda:

Transmiterea argumentelor din cererea

Aproape întotdeauna, va trebui să transfere datele HTTP-cerere (de exemplu, o probă de $ _POST) la echipa. În loc să vă obligă să descrie manual fiecare cerere, Laravel oferă ceva mai automatizat. Uită-te la DispatchesCommands trasatura metoda dispatchFrom:

Acest constructor metoda arata, al cărui nume este trecut ca primul argument, și ia o cerere de $ variabila (HTTP-cerere, sau pur și simplu orice tip de obiect ArrayObject) acele chei care se potrivesc cu numele variabilei în argumentul constructorului. De exemplu, în cazul în care există un constructor cu argumente variabile $ firstName. atunci i se atribuie valoarea firstName HTTP-cerere.

Puteți trece o matrice ca al treilea argument implicite:

Rularea acest fundal

autobuz de comandă pot fi utilizate nu numai pentru lansarea imediată a sarcinilor în cererea curentă, dar, de asemenea, a pus echipa în loc de a le rula într-un proces separat. Astfel, magistrala de comandă poate fi principalul instrument pentru plasarea în coadă.

Pentru a crea o echipa care va rula în fundal, adăugați pavilion --queued:

Creat de clasă vor moșteni interfata Illuminate \ Contractelor \ Coadă \ ShouldBeQueued și au SerializesModels trasatura. Aceasta functionalitate va permite echipei adăugate la coadă pentru lansarea ulterioară a cozii de ascultător și adaugă capacitatea de a serializa si deserializati Elocvent-model.

Dacă deja ați configurat o echipă și doresc să facă să funcționeze în fundal, trebuie doar să adăugați manual implementează Illuminate \ Contracte \ Coadă \ ShouldBeQueued. Această interfață nu conține metodele necesare și este pur și simplu un indicator la magistrala de comandă. După această metodă de expediere în loc de a avea pentru a executa comanda, pune-l într-o coadă pentru a începe mai târziu, în fundal.

echipa transportoare

Înainte de echipa va fi în fața operatorului, îl puteți aduce pe banda transportoare în alte clase. Comenzile transportoare, de asemenea, funcționează ca HTTP-mediatori. De exemplu, puteți încadra toate operațiunile efectuate de echipa în tranzacție, sau pur și simplu pentru a înregistra faptul punerii sale în aplicare.

Pentru a adăuga un transportor la autobuz de comandă, apelați pipeThrough metoda managerului în metoda lui App \ Providers \ BusServiceProvider :: boot:

Comenzile transportoare descrise în metoda de mâner:

Clasele care trebuie să se angajeze în conducta, sunt căutate și descărcate prin containerul de serviciu. astfel încât să puteți specifica orice dependențe în constructorii lor.

Deoarece elementul transportor poate fi utilizat de asemenea circuite:

Alatura-te acum