Construiți primul pachet de administrare pentru Laravel

Este greu să negi faptul că comunitatea PHP este încântată de Laravel 4. Printre altele, cadrul folosește puterea compozitorului, ceea ce înseamnă că este capabil să folosească orice pachet sau scenariu de la Packagist.

Între timp, Laravel oferă "Bundle", care ne permit să modularizăm codul pentru utilizare în proiectele viitoare. Directorul de pachete este plin de scripturi și pachete excelente pe care le puteți utiliza în aplicațiile dvs. În această lecție, vă voi arăta cum să construiți unul de la zero!


Așteaptă, ce este un pachet?

Bundlele oferă o modalitate ușoară de a grupa codul asociat. Dacă sunteți familiarizat cu CodeIgniter, pachetele sunt destul de asemănătoare cu "Sparks". Acest lucru este evident atunci când vă uitați la structura folderului.

Crearea unui pachet este destul de simplă. Pentru a ilustra acest proces, vom construi un panou de control al panoului de administrare pe care îl putem folosi în cadrul proiectelor viitoare. În primul rând, trebuie să creați un director "admin" în dosarul "pachete". Încercați să replicați structura folderului din imaginea de mai sus.

Înainte de a începe să adăugăm ceva la pachetul nostru, trebuie să îl înregistrăm mai întâi la Laravel. Acest lucru se face în aplicația dvs. bundles.php fişier. Odată ce deschideți acest fișier, ar trebui să vedeți o matrice returnată; trebuie doar să adăugăm pachetul nostru și să definim a mâner. Acesta va deveni URI-ul în care accesăm panoul nostru admin.

'admin' => array ('mânere' => 'admin')

Aici, am numit-o pe a mea, "admin", dar simțiți-vă liber să-i apelați orice vreți.

Odată ce avem această configurație, trebuie să creați o start.php fişier. Aici vom face câteva lucruri, cum ar fi spațiile de nume. Dacă nu sunteți deranjat de acest lucru, atunci nu aveți nevoie de un fișier de pornire pentru ca pachetul dvs. să funcționeze așa cum era de așteptat.

Clasa de autoloader a lui Laravel ne permite să facem câteva lucruri: harta noastră a controlorului de bază și a numelor de autoload.

Autoloader :: harta (array ('Admin_Base_Controller' => Bundle :: calea ('admin'). 'Controllers / base.php',)); Autoloader :: namespaces (array ('Admin \ Modules' => Bundle :: calea 'admin') 'models', 'Admin \ Libraries' => Bundle :: path (' );

Păstrarea numelor va asigura că nu suntem în conflict cu alte modele sau biblioteci deja incluse în aplicația noastră. Veți observa că nu am optat să nu numim controlorii noștri pentru a face lucrurile mai ușoare.


Activități de publicare

Pentru panoul de administrare, vom profita de bootstrap-ul de pe Twitter, deci du-te apuca o copie. Putem face acest lucru într-un public în interiorul pachetului nostru pentru a publica ulterior cererea noastră.

Când sunteți gata să le publicați, trebuie doar să rulați următoarea comandă prin artizan.

php artisan bundle: publicare admin

Aceasta va copia structura și fișierele de directoare la pachete directorul nostru în public , în cadrul rădăcinii instalației Laravel. Apoi putem folosi acest lucru în controlerul de bază al pachetului nostru.


Configurarea controlerului de bază

Este întotdeauna o idee inteligentă de a configura un controler de bază și de a se extinde de acolo. Aici, putem configura controlere restabile, definim aspectul și includ orice active. Trebuie doar să sunăm la acest fișier, base.php, și să-l afișăm în directorul nostru al controlorului.

În primul rând, hai să facem ceva din gospodărie. Desigur, vom dori să folosim controlorii de odihnă ai lui Laravel.

public $ restful = adevărat;

Și vom specifica un aspect pe care îl vom crea în scurt timp. Dacă nu sunteți obișnuiți cu aspectul controlorilor, atunci sunteți pregătit pentru un tratament.

public $ layout = 'admin :: layouts.main';

Numele pachetului, urmat de două coloane, este o paradigmă în Laravel, pe care o vom vedea mai mult în viitor, deci ține-ți ochii.

Atunci când se manipulează activele din pachetul nostru, putem face lucrurile conform așteptărilor și specificăm calea din rădăcina folderului public. Din fericire, Laravel este acolo pentru a ne face viața mai ușoară. În construcția noastră, trebuie să specificăm pachetul, înainte de a adăuga la containerele noastre de materiale.

Asset :: container ( 'header') -> pachet ( 'admin'); Asset :: container ( 'subsol') -> pachet ( 'admin');

Dacă nu sunteți familiarizați cu containerele de materiale, nu vă faceți griji; ele sunt doar secțiuni ale unei pagini în care doriți să vă găzduiți activele. Aici vom include foi de stil în antet și scripturile din subsol.

Acum, cu asta din drum, putem să includem cu ușurință stilurile și scripturile noastre de bootstrap. Controlerul de bază completat trebuie să arate similar cu:

clasa Admin_Base_Controller extinde Controller public $ restful = true; public $ layout = 'admin :: layouts.main'; funcția publică __construct () parent :: __ construct (); Asset :: container ( 'header') -> pachet ( 'admin'); Conținutul :: container ('header') -> add ('bootstrap', 'css / bootstrap.min.css'); Asset :: container ( 'subsol') -> pachet ( 'admin'); Conținutul :: container ('footer') -> add ('jquery', 'http://code.jquery.com/jquery-latest.min.js'); Conținutul :: container ('footer') -> add ('bootstrapjs', 'js / bootstrap.min.js');  / ** * Metoda captură-toate pentru cererile care nu pot fi potrivite. * * @param string $ metoda * @param array $ parametri * @return Response * / funcția publică __call ($ method, $ parametri) return Response :: error ('404'); 

De asemenea, am adus cererea de captură de la controlerul de bază al aplicației pentru a returna un răspuns 404, în cazul în care nu se găsește o pagină.

Înainte de a face orice altceva, să facem fișierul pentru acel aspect, vizualizari / aspect / main.blade.php, astfel încât nu mai întâlnim erori ulterior.


Securizarea pachetului

Pe măsură ce construim un panou de administrare, vom dori să-i oprim pe oameni. Din fericire, putem folosi extensia lui Laravel Auth clasa pentru a realiza acest lucru cu usurinta ...

În primul rând, trebuie să ne creăm masa; Voi folosi "administratori" ca numele meu de masă, dar o puteți schimba, dacă doriți. Artisan va genera o migrare și va apărea în directorul de migrații al pachetului nostru. Doar rulați următoarele în linia de comandă.

php artisan migrează: face admin :: create_admins_table

Construirea Schemei

Dacă nu sunteți familiarizat cu constructorul schemelor, vă recomandăm să aruncați o privire asupra documentației. Vom include câteva coloane:

  • id - Aceasta va crește automat și va deveni cheia noastră primară
  • Nume
  • nume de utilizator
  • parola
  • e-mail
  • rol - nu vom profita de acest lucru astăzi, dar vă va permite să extindeți pachetul mai târziu

Vom include și marcajele temporale implicite, pentru a urma cele mai bune practici.

/ ** * Efectuați modificări în baza de date. * * @return void * / funcția publică sus () Schema :: create ('admin', funcția ($ table) $ table-> increments ('id' ); $ table-> string ('username', 32) -> unic (); $ table-> string ('parola' ; $ table-> string ('rol', 32); $ table-> timestamps (););  / ** * Reveniți modificările la baza de date. * * @return void * / funcția publică în jos () Schema :: drop ('admins'); 

Acum, când avem structura bazei noastre de date, trebuie să creăm un model asociat tabelului. Acest proces este în esență identic cu modul în care am putea realiza acest lucru în aplicația noastră principală. Creăm fișierul și modelul, bazându-ne pe forma singulară a numelui tabelului nostru - dar trebuie să ne asigurăm că numele nostru este corect.

namespace Admin \ Modele; utilizați \ Laravel \ Database \ Elocvent \ Model ca elocvent; clasa Admin extinde elocvent 

Deasupra, ne-am asigurat că folosim spațiul de nume pe care l-am definit start.php. De asemenea, pentru a putea face referire corect la Eloquent, creăm un alias.

Extinderea funcției Auth

Pentru a ne păstra pachetul complet autonom, va trebui să ne extindem AUTH. Acest lucru ne va permite să definim un tabel doar pentru a vă conecta la panoul de administrare și pentru a nu interfera cu aplicația principală.

Înainte de a crea driverul nostru personalizat, vom crea un fișier de configurare, unde puteți alege dacă doriți să utilizați nume de utilizator sau e-mail coloane din tabelul bazei de date.

rândul de întoarcere ('username' => 'username', 'password' => 'parola',);

Dacă doriți să modificați coloanele pe care le vom folosi, modificați pur și simplu valorile de aici.

Următoarea nevoie de a crea driverul. Să o numim "AdminAuth" și să o includem în dosarul nostru de biblioteci. Din moment ce extindem Auth, trebuie doar să suprascriem câteva metode pentru a face ca totul să funcționeze așa cum intenționăm.

 namespace Admin / Biblioteci; utilizați Admin \ Models \ Admin ca Admin, Laravel \ Auth \ Drivers \ Elocvent ca Elocvent, Laravel \ Hash, Laravel \ Config; clasa AdminAuth se extinde Elocvent / ** * Obțineți utilizatorul curent al aplicației. * * În cazul în care utilizatorul este un oaspete, null ar trebui returnat. * * @param int | object $ token * @return amestecat | null * / retrieve functie publica ($ token) // Returnati un obiect aici fie daca tokenul trecut este un integer (ID) // sau daca suntem trecuti un model de obiect de tip corect, dacă (filter_var ($ token, FILTER_VALIDATE_INT)! == false) retur $ this-> model () -> find ($ token);  altfel dacă (get_class ($ token) == nou Admin) return $ token;  / ** * Încercați să înregistrați un utilizator în aplicație. * $ @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $% $ username = Config :: get ('admin :: auth.username'); $ query-> unde ($ username, '=', $ arguments ['username']); foreach (array_except ($ arguments, nume de utilizator ',' parolă ',' amintesc ')) ca $ column => $ val) $ query-> unde ($ column,' = ', $ val);) -> first; // Dacă datele de identificare se potrivesc cu ceea ce este în baza de date, noi doar // vom înregistra utilizatorul în aplicație și ne vom aminti dacă le vom întreba. $ password = $ argumente ['parola']; $ password_field = Config :: obține ('admin :: auth.password', 'password'); dacă is_null ($ user) și Hash :: check ($ parola, $ user -> $ password_field)) return $ this-> login ($ user-> get_key (), array_get „));  return false;  model funcțional protejat () return new Admin; 

Acum că am creat șoferul, trebuie să-l lăsăm pe Laravel să știe. Putem folosi Auth's extinde metodă de a face acest lucru în nostru start.php fişier.

Auth :: extend ('adminauth', funcția () returnează noua Admin \ Libraries \ AdminAuth;);

Un ultim lucru pe care trebuie să-l facem este să configurezi Auth să folosească acest lucru la runtime. Putem face acest lucru în constructorul nostru de bază controler cu următoarele.

Config :: set ('auth.driver', 'adminauth');

Route și Controlere

Înainte de a putea ajunge la orice, trebuie să creăm un controler. Să ne creăm controlerul de bord, ceea ce vom vedea după ce ne-am conectat.

Așa cum vom dori ca acest lucru să apară la rădăcina pachetului nostru (adică mânerul pe care l-am definit mai devreme), va trebui să sunăm home.php. Laravel utilizează cuvântul cheie "de origine" pentru a stabili ce doriți să apară la rădăcina aplicației sau pachetului dvs..

Extindeți controlerul de bază și creați o vizualizare index. Pentru moment, pur și simplu întoarceți "Hello World" pentru a ne asigura că totul funcționează bine.

clasa Admin_Home_Controller extinde Admin_Base_Controller funcția publică get_index () return 'Hello World'; 

Acum, când controlorul nostru este configurat, putem să ne îndreptăm spre el. Creeaza o routes.php în pachetul dvs., dacă nu ați făcut-o deja. Similar cu aplicația noastră principală, fiecare pachet poate avea propriul fișier de rute care funcționează identic.

Route :: controller (array ('admin :: home',));

Aici, am înregistrat controlerul de acasă, pe care Laravel îl va aloca automat /. Mai târziu, vom adăuga controlerul de conectare la matrice.

Dacă te îndrepți spre / admin (sau orice altfel de manieră ați definit mai devreme) în browser-ul dvs., atunci ar trebui să vedeți "Hello World".


Construirea formularului de conectare

Să creăm controlerul de conectare, mai degrabă decât să extindem controlerul de bază, vom extinde controlerul principal al lui Laravel. Motivul acestei decizii va deveni evident în scurt timp.

Pentru că nu ne extindem, trebuie să stabilim câteva lucruri înainte de a începe - și anume aspectul liniștit, conducătorul autorului corect și activele noastre.

clasa Admin_Login_Controller extinde Controller public $ restful = true; funcția publică __construct () parent :: __ construct (); Config :: set ('auth.driver', 'adminauth'); Asset :: container ( 'header') -> pachet ( 'admin'); Conținutul :: container ('header') -> add ('bootstrap', 'css / bootstrap.min.css'); 

Să formăm, de asemenea, punctul nostru de vedere. Vom folosi motorul de template-uri Blade - Laravel - pentru a grăbi lucrurile. În directorul de vizualizări a pachetelor, creați un director "login" și un fișier "index.blade.php" în el.

Vom afișa o structură standard a paginii HTML și vom econa activele.

    Logare Activ :: container ( 'header') -> stiluri ()     

Acum, să ne asigurăm că se creează vizualizarea în controler. Pe măsură ce folosim controale de odihnă, putem profita de verbul "get" în metoda noastră.

funcția publică get_index () retur View :: make ('admin :: login.index'); 

Minunat! Acum suntem buni să începem să construim formularul pe care îl putem crea împreună cu Formă clasă.

Forma :: open  Formularul (Formularul (e-mail)]  Formularul: , 'Parola') Forma :: parola ('parola') Form :: submit (' Formă :: token () Form :: close ()

Mai sus, am creat un formular care se va posta în sine (exact ceea ce vrem), împreună cu diverse elemente de formă și etichete pentru a merge cu ea. Următorul pas este să procesați formularul.

Pe măsură ce trimitem formularul spre sine și folosim controale restabile, trebuie doar să creăm post_index și utilizați această metodă pentru a procesa datele de conectare. Dacă nu ați mai folosit Auth înainte, atunci mergeți și aruncați o privire la documentație înainte de a continua.

funcția publică post_index () $ creds = array ('username' => Introducere :: get ('username'), 'password' => Input :: get ('parola');); dacă (Auth :: try ($ creds)) returnează Redirect :: la (URL :: to_action ('admin :: home @ index'));  altceva returnare Redirecționare :: înapoi () -> cu ('eroare', adevărat); 

Dacă acreditările sunt corecte, utilizatorul va fi redirecționat către tabloul de bord. În caz contrar, vor fi redirecționați înapoi cu o eroare pe care o putem verifica în vizualizarea de autentificare. Deoarece aceasta este doar datele de sesiune, și nu erorile de validare, trebuie doar să implementăm o verificare simplă.

@if (Session :: get ('error')) Ne pare rău, numele de utilizator sau parola dvs. au fost incorecte. @endif

De asemenea, trebuie să conectăm utilizatorii; așa că hai să creăm a get_logout și adăugați următoarele. Acest lucru va loga utilizatorii afară, și apoi redirecționați-le atunci când vizitează / Admin / conectare / deconectare.

funcția publică get_logout () Auth :: logout (); returnează Redirect :: la (URL :: to_action ('admin :: home @ index')); 

Ultimul lucru pe care ar trebui să-l facem este să adăugăm controlerul de conectare la fișierul nostru de rute.

Route :: controller (array ('admin :: home', 'admin :: login',));

Filtrarea rutelor

Pentru a împiedica oamenii să ocolească ecranul de conectare, trebuie să filtram rutele noastre pentru a determina dacă sunt utilizatori autorizați. Putem crea filtrul în nostru routes.php, și atașați-o la controlerul de bază, pentru a filtra înainte de afișarea rutei.

Route :: filtru ('auth', function () if (Auth :: guest ()) returneaza Redirect :: to (URL :: to_action ('admin :: login'));

În acest moment, tot ce trebuie să faceți este să apelați acest lucru în constructorul bazei noastre de bază. Dacă ne-am extinde controlerul de conectare de la baza noastră, atunci vom avea o buclă infinită care în cele din urmă s-ar termina.

$ this-> filter ("înainte", "auth");

Configurarea vizionărilor

Mai devreme, ne-am creat main.blade.php aspect; acum, vom face ceva cu ea. Să obținem o pagină HTML și să fie aduse activele noastre.

    $ Titlu Activ :: container ( 'header') -> stiluri ()    
$ Conținut
Activ :: container ( 'footer') -> scripturi ()

Veți observa că și eu am reluat câteva variabile: titlu $ și conținut $. Vom putea folosi metode magice de la controlorul nostru pentru a transmite date către acestea. De asemenea, am apucat conținut $ în interiorul containerului div că Bootstrap va oferi stilul pentru.

Apoi, să creăm vizualizarea tabloului de bord. Pe măsură ce vom cuibări acest lucru, trebuie doar să punem conținutul pe care dorim să-l punem în containerul nostru.

Salut

Aceasta este vizualizarea tabloului de bord

Salvați ca index.blade.php în cadrul vizualizari / tabloul de bord din interiorul pachetului dvs..

Acum trebuie să setăm controlorul nostru să profite de aspectul și să vedem fișierele pe care tocmai le-am creat. În cadrul get_index metodă pe care am creat-o mai devreme, adăugați următoarele.

$ this-> layout-> title = 'Tablou de bord'; $ this-> layout-> cuib ('content', 'admin :: dashboard.index');

titlu este o metodă magică pe care o putem număra apoi ca o variabilă în structura noastră. Prin utilizarea cuib, suntem în măsură să includă o vedere în interiorul aspectului direct de la controlorul nostru.


Crearea unei sarcini

Pentru a accelera lucrurile, Laravel ne oferă o modalitate ușoară de a executa codul din linia de comandă. Acestea sunt numite "Sarcini"; este o idee bună să creați unul pentru a adăuga un utilizator nou la baza de date cu ușurință.

Trebuie doar să ne asigurăm că fișierul va prelua numele sarcinii noastre și va fi afișat în directorul de sarcini al pachetului nostru. O să spun asta setup.php, așa cum o vom folosi imediat după instalarea pachetului.

 utilizați comanda Laravel \ CLI \ ca comandă; utilizați Admin \ Models \ Admin ca Admin; clasa Admin_Setup_Task funcția publică execută (argumente $) if (empty ($ arguments) || count ($ arguments) < 5) die("Error: Please enter first name, last name, username, email address and password\n");  Command::run(array('bundle:publish', 'admin')); $role = (!isset($arguments[5])) ? 'admin' : $arguments[5]; $data = array( 'name' => $ argumente [1], 'username' => $ argumente [2], 'email' => $ argumente [3], 'password' => Hash :: make ]), 'role' => $ role,); $ user = Admin :: creare ($ data); echo ($ user); 'Admin creat cu succes!'; : "Eroare la crearea adminului!";

Laravel va trece printr-o serie de argumente; putem conta pentru a ne asigura că obținem exact ceea ce vrem. Dacă nu, vom relua o eroare. De asemenea, veți observa că folosim Comanda clasa pentru a rula pachet: publica. Acest lucru vă va permite să executați orice sarcină de linie de comandă încorporată în Laravel în interiorul aplicației sau pachetului.

Principalul lucru pe care o are această sarcină este să apucă argumentele care trec la ea, să spună parola și să introducă un nou administrator în Administratori masa. Pentru a rula acest lucru, trebuie să folosim următoarele în linia de comandă.

php artisan admin :: instalare nume de familie nume de utilizator username [email protected] parola

Ce??

În acest tutorial, am creat un panou administrativ care este ușor de prelungit. De exemplu, rolurile coloana pe care am creat-o va permite să limitați ceea ce pot vedea clienții dvs..

Un pachet poate fi orice de la un panou de administrare, așa cum am construit astăzi, la Markdown parser - sau chiar întregul Zend Framework (nu glumesc). Tot ceea ce ne-am acoperit aici vă va stabili pe calea dvs. de a scrie minunate pachete Laravel, care pot fi publicate în directorul pachetului Laravel.

Aflați mai multe despre crearea pachetelor Laravel aici pe Nettuts+.

Cod