Elementele esențiale ale creării pachetelor Laravel

Cadrul Laravel PHP oferă sistemul său de pachete pentru a permite dezvoltatorilor să redistribuie pachete de coduri utile sau să organizeze aplicații în mai multe "pachete" de aplicații mai mici.

În acest tutorial, vom învăța cum să creați și să distribuiți pachete de la zero.

Un pachet Laravel are acces la toate caracteristicile pe care cadrul oferă aplicației gazdă, inclusiv rutare, migrații, teste, vizualizări și numeroase alte caracteristici utile.

Iată un mic secret, între noi: cerere directorul pachetului sursă Laravel este, de asemenea, un pachet, pe care Laravel îl numește DEFAULT_BUNDLE.


Când să creați un pachet?

Înainte de a scrie o nouă bucată de cod, îmi place să-mi pun câteva întrebări simple pentru a stabili dacă este potrivit pentru un pachet. Lasă-mă să împărtășesc această tehnică cu tine.

Poate acest cod să fie util altora?

Dacă răspunsul la această întrebare este da, atunci mă asigur că cineva nu a creat deja un pachet sau un pachet similar. Altfel decât în ​​scopuri de învățare, este inutil să recreezi roata. Dacă celălalt pachet are un standard suficient de ridicat pentru a fi utilizat în proiectul dvs., atunci utilizați acest lucru și salvați-vă timpul.

În al doilea rând, mă gândesc la cod și decid dacă este sau nu util pentru utilizatorii altor cadre sau pentru cei care nu folosesc deloc un cadru. În cazul în care codul nu are legătură cu cadrul Laravel și nu are nevoie să utilizeze clasele de bază ale lui Laravel, atunci aș crea un pachet Compozitor în schimb. Pachetele de compozitori devin în mare măsură standard pentru partajarea codului, care nu se limitează la un singur cadru sau la un proiect.

Pentru mai multe informații despre compozitor, consultați următoarele linkuri:

  • Documentația oficială
  • Gestiune ușoară a pachetelor cu compozitor

Dacă codul ar putea fi util altora și depinde de cadrul Laravel, atunci aveți un motiv bun pentru a crea un pachet nou.

Va trebui să scriu din nou acest cod?

DRY este numele jocului.

Dacă codul furnizează funcționalitatea pe care o scrieți frecvent, atunci este logic să creați un pachet. DRY (Nu te repeta!) Este numele jocului.

Ar putea fi considerat acest cod o aplicație autonomă?

De exemplu, este posibil să construiți un site simplu care, printre alte caracteristici, are o componentă de blog. Blogul ar putea fi considerat o aplicație separată care va fi inclusă într-un pachet pentru o organizare mult mai bună a proiectului dvs..

Un alt exemplu ar fi o secțiune administrativă sau "back-end" pentru site-ul dvs. Web. Această secțiune ar putea fi considerată cu ușurință o componentă separată de aplicația principală și ar putea fi organizată în unul sau mai multe pachete.

Acest cod se încadrează într-o singură clasă?

Dacă este cazul, vă recomandăm să scrieți în schimb o "bibliotecă". O bibliotecă este o singură clasă care conține cod reutilizabil. Acesta poate fi adăugat la un proiect Laravel cu ușurință prin abandonarea clasei în application / biblioteci / director, care este încărcat automat în mod implicit.


Crearea unui pachet

Să creăm un simplu plug-in care interacționează cu serviciul Gravatar pentru a oferi o metodă simplă de generare a avatarelor de diferite dimensiuni în cadrul aplicației noastre principale. Vom adăuga, de asemenea, funcționalitatea necesară pentru a introduce o adresă de e-mail și o dimensiune a avatarului și pentru a previzualiza gravatarul asociat din pagină.

Să începem prin crearea unui nou director în cadrul / balot directorul proiectului nostru. Vom numi directorul și pachetul nostru gravvy. Nu sosuri ... gravuri.

Să adăugăm gravvi la matricea pachetelor înăuntru application / bundles.php astfel încât să îl putem testa pe măsură ce mergem. Vom adăuga un 'auto' => adevărat opțiunea pentru matrice, astfel încât pachetul să fie pornit automat și orice mapări autoloader pe care le creăm vor fi disponibile pentru întregul Laravel.

retur array ('docs' => array ('mâini' => 'docs'), 'gravvy' => array ('auto' => true));

În primul rând, va trebui să creați o mică bibliotecă care să returneze avatul unui utilizator, utilizând o adresă de e-mail. Creați un fișier nou în rădăcina pachetului, numit gravvy.php. Să creăm o clasă, numită Gravvy cu o metodă statică, face(), să replicăm schema de numire folosită de bibliotecile proprii ale Laravel.

face() metoda va accepta doi parametri: o adresă de e-mail și un număr întreg care să reprezinte dimensiunea avatarului pentru a fi preluat.

 * / clasa Gravvy / ** * Creați un nou element de imagine dintr-o adresă de e-mail. * @ string param $ email Adresa de e-mail. * @ param integer $ size Dimensiunea avatarului. * @ string string Sursa pentru un element de imagine. * / funcția statică publică face ($ email, $ size = 32) // convertește e-mailul nostru într-un hash $ md5 $ email = md5 ($ email); // returnați returnul elementului imagine ' 

La pornirea unui pachet, Laravel caută un fișier numit start.php, și o execută. Deci, să creați unul în directorul noului nostru pachet pentru a ține harta automată.

 calea ("pachetele"). "/ gravavy / gravvy.php"));

Acum Laravel știe unde să găsească definiția pentru noi Gravvy clasa și va încărca sursa atunci când are nevoie de ea. Foarte eficient!

cale() este o funcție de ajutor, care returnează calea absolută către folderele utile utilizate de Laravel. În acest caz, îl folosim pentru a extrage calea absolută către directorul pachetelor.

Acum că avem clasa noastră de lucru Gravvy, am putea încerca să o folosim din cadrul unui controlor pentru a vedea dacă obținem rezultatul așteptat, dar cred că ar fi mai potrivit să scrieți un test de unitate.

La fel ca și aplicația gazdă, sunt disponibile teste unitare din interiorul pachetului. Să creăm a teste folder în cadrul pachetului și adăugați un nou fișier numit general.test.php.

assertEquals (Gravvy :: make ('[email protected] '),'„);  / ** * Testați că o ieșire avatară apare așa cum se aștepta atunci când * se specifică o dimensiune personalizată a avatarului. * * @return void * / test funcția publicăAvatarImageIsGeneratedWithSize () // începe pachetul gravuri Bundle :: start ('gravvy'); // verificați dacă rezultatul corespunde așteptărilor $ this-> assertEquals (Gravvy :: make ('[email protected] ', 64),'„); 

Mai sus, am scris două teste PHPUnit: una pentru a testa rezultatul generării unui avatar folosind un e-mail și altul care specifică și o dimensiune a avatarului în pixeli. Veți observa că sunăm Bundle :: începe ( 'gravvy') pentru a porni manual pachetul. Acest lucru se datorează faptului că Laravel nu încarcă automat pachete prin interfața liniei de comandă în prezent.

Ca membru al echipei de bază, aș dori să subliniez că intenționăm să rezolvăm acest lucru într-o versiune viitoare!

Să folosim Artisan pentru a rula testele PHPUnit tastând Test comandați și utilizați numele pachetului, gravvy, ca parametru.

php artisan test gravvy

Grozav! Testele noastre s-au desfășurat cu succes în prima încercare, iar eul nostru a crescut - doar puțin!

Acum că clasa noastră Gravvy a fost testată, oamenii o pot folosi în propriile aplicații! Să luăm pachetul un pas mai departe și să creăm câteva pagini simple pentru a genera și previzualiza gravatare. Putem folosi acest exemplu pentru a afla cum sistemul de dirijare se ocupă de pachete.

Pentru a începe, să creăm un nou controler de previzualizare pentru pachetul nostru. Va trebui să creați o controlere director în pachet și, în cadrul acestuia, vom adăuga un nou fișier: preview.php.

 

Numele controlerului trebuie să fie prefixat cu numele pachetului și să fie atașat cu _Controlor - ca și în cazul controlorilor normali.

Am putea crea câteva rute pentru a mapa acțiunile controlorului nostru către URI sensibile, dar nu ar fi mai bine dacă l-am putea lăsa pe utilizatorul pachetului nostru să decidă pe baza URI-ului de bază pe care să o folosească? Ar fi? Să facem asta atunci!

Prin adăugarea a 'mânere' => 'gravvy' pereche cheie-valoare pentru matricea de configurații a pachetelor, putem permite utilizatorului să o schimbe fără a modifica codul pachetului propriu-zis. Iată configurația rezultată din application / bundles.php.

retur array ('docs' => array ('handles' => 'docs'), 'gravvy' => array ('auto' => true, 'handles' => 'gravvy'));

Acum putem folosi (:pachet) placeholder în rutele noastre, care va fi înlocuit cu valoarea mânere opțiune. Să creăm a routes.php fișier în rădăcina pachetelor noastre și adăugați câteva rute.

Route :: obțineți ('(: bundle) / form', 'gravvy :: preview @ form'); Traseu :: post ('(: bundle) / preview', 'gravvy :: preview @ preview');

Avem traseul Primești gravvii / forma care este mapat la formă acțiunea previzualizare controler, și POST gravvy / previzualizare care este mapat la previzualizare acțiunea previzualizare controlor.

Să creăm vederile asociate pentru acțiunile noastre de controlor; le puteți face la fel de complexe și drăguțe cum doriți, dar eu le voi păstra simplu. Mai întâi, creați o vizualizari în cadrul pachetului, la fel ca în directorul de aplicații.

 

Acum, că avem un formular care va trimite un câmp de e-mail și dimensiune la previzualizare @ previzualizare perechea de controler / acțiune, să creăm o pagină de previzualizare a avatarului generat; vom folosi un atribut numit $ element de, pentru a-și menține sursa.

 

$ element

HTML :: link \ _to \ _action ('gravvy :: preview @ form', '< Go Back!')

Acum trebuie să schimbăm previzualizare de a utiliza datele furnizate din formular.

/ ** * Afișează avatarul rezultat. * / funcția publică action_preview () // obține date din formularul nostru $ email = Input :: get ('email'); $ size = intrare :: get ('size'); // generează avatar $ avatar = Gravvy :: face ($ email, $ size); // încărcați vizualizarea în previzualizare retur View :: make ('gravvy :: preview') -> cu ('element', $ avatar); 

Descoperim datele POST și le folosim pentru a crea avatarul nostru. Trebuie să adăugăm și o cu() metoda pentru a Vezi :: face () pentru a permite ca elementul să fie utilizat în cadrul vizualizării.

În final, putem testa sistemul nostru de previzualizare a avatarului! Uitați-vă la / Gravvy / formular URI și dați-i drumul! Totul funcționează așa cum era de așteptat.

Este posibil ca aceasta să nu fie cea mai bună modalitate de a organiza pachetul dvs., dar scoate în evidență câteva lucruri utile care sunt posibile. Distrează-te la crearea propriilor dvs. pachete și asigurați-vă că vă recomandăm să le publicați pe site-ul pachetelor.


Publicarea unui pachet

Odată ce pachetul dvs. este într-o stare funcțională, vă recomandăm să îl includeți în directorul Laravel Bundles. Să trecem prin procesul de trimitere a unui pachet nou.

În primul rând, va trebui să aveți un cont GitHub și să aveți versiunea dvs. pachet într-un depozit public. GitHub oferă conturi gratuite cu un număr nelimitat de depozite publice; veți găsi formularul de înscriere aici.

Dacă sunteți nou la controlul versiunii cu Git, vă sugerăm să citiți seria mare de articole Git chiar aici pe Nettuts+.

Odată ce aveți contul și codul în ordine, asigurați-vă că cea mai recentă versiune a pachetului dvs. poate fi găsită în ramura "master" și că rădăcina pachetului dvs. (în cazul în care start.php ar fi) este rădăcina depozitului, mai degrabă decât o subdirectorie.

Apoi, vizitați site-ul web al Directorului Laravel Bundles și conectați-vă utilizând datele dvs. de acreditare GitHub.

Faceți clic pe butonul "Trimiteți un pachet", selectați depozitul de pachete din meniul derulant și apăsați butonul "Continuați".

Formularul de înscriere este destul de direct, dar aici sunt niște "gotchas" pe care nu le puteți observa.

Nume

Numele este un cuvânt cheie minuscule care se utilizează pentru a instala aplicația. Trebuie să fie un cuvânt scurt dar precis pentru a descrie pachetul dvs..

Rezumat / Descriere

Aceste câmpuri pot conține conținut în format marcaj. Deci, nu ezitați să copiați conținutul din GitHub README.md fişier.

Dependențe / etichete

Utilizați butonul virgulei de pe tastatură pentru a separa etichetele și dependențele. Câmpul de dependență trebuie să conțină cuvântul cheie de instalare scurt pentru pachetul care există ca dependență pentru pachetul pe care îl trimiteți.

Activ

Activ câmpul determină pur și simplu dacă pachetul va fi sau nu afișat altor utilizatori. Încă mai puteți să instalați pachete inactive prin intermediul cuvântului cheie de instalare, în scopul testelor. Setați acest câmp la "Da" numai atunci când sunteți fericiți pentru alte persoane să vă folosească pachetul.

După ce faceți clic pe butonul "Salvați", pachetul dvs. a fost trimis și, dacă este marcat ca "Activ", va apărea în listele de pachete. Puteți oricând să editați listele de pachete la o dată ulterioară.


Găsirea pachetelor

Bundlele care au fost distribuite comunității Laravel sunt listate în directorul Bundles la http://bundles.laravel.com.

Puteți căuta pachete pe categorii sau puteți utiliza funcția de căutare pentru a găsi pachetul pe care îl căutați. Odată ce ați găsit un pachet care îndeplinește cerințele dvs., aruncați o privire la fila "Instalare" a profilului pachetului pentru a găsi cuvântul cheie de instalare.


Instalarea unui pachet

După ce ați instalat cuvântul cheie pentru un pachet, îl puteți instala de la baza proiectului folosind interfața de comandă "Artisan" și este pachet: instalați comanda. De exemplu…

php artisan bundle: instalează bob

Artisan va consulta API-urile pentru pachete pentru a recupera calea către depozitele GitHub și pentru depozitele tuturor dependențelor sale. Apoi va descărca pachetele sursă direct de la GitHub și le extrage la / balot pentru tine.

Va trebui să adăugați manual numele pachetului în interiorul matricei application / bundles.php pentru ca pachetul să fie activat.

array return ('docs' => array ('mânere' => 'docs'), 'bob');

În anumite situații, este posibil să fie necesar să adăugați informații suplimentare în acest sens mulțime intrarea pentru a facilita pornirea automată sau direcționarea anumitor rute spre pachet. Autorul va fi furnizat aceste informații suplimentare în descrierea pachetelor, dacă este cazul.


Vă mulțumim pentru lectură și vă bucurați de crearea propriilor dvs. pachete cu Laravel! Dacă doriți să aflați mai multe despre Laravel, asigurați-vă că ați luat cartea mea!

Cod