AngularJS og Laravel Begynn å bygge en CRM

Når du oppretter en enkeltsidig app, bør vi bruke en slags rammeverk for å gjøre noe av jobben for oss, så vi kan fokusere på den faktiske funksjonaliteten. AngularJS passer perfekt, fordi funksjoner som dynamisk avhengighetsinjeksjon og toveisbinding er bare bra. Noen ganger krever vi også en slags server. Hvis du har valgt PHP, kan Laravel være ditt beste alternativ, da det er lett å jobbe med og ganske kraftig.

Introduksjon

I denne opplæringen vil du opprette et enkelt kunde / transaksjonsstyringssystem med muligheten til å legge til og fjerne både transaksjoner og kunder. Dette er sannsynligvis ikke den typen ting du gjør veldig ofte, men det viser hvordan du bruker funksjoner i begge rammene.

Før vi starter, bør du sette opp en MySQL-database som vi skal bruke (Laravel støtter mange flere av dem, men dette er fortsatt den mest populære). Du trenger ikke noen webserver siden vi skal bruke PHPs innebygde (men vær så snill å huske på det Denne løsningen er kun for utviklingen og bør aldri brukes i produksjon - det mangler mange funksjoner som kreves for at appen din skal fungere skikkelig i offentligheten). For det trenger vi minst PHP versjon 5.4.0.

Forberedelse

Det første vi må gjøre er å installere Laravel. Den fullstendige prosessen er beskrevet på Laravels nettsted. Deretter bør du ha prosjektkatalogen din opprettet med alle Laravel-filene der inne. Naviger til den katalogen i kommandolinjen og kjør denne kommandoen der:

php artisan tjene

Hvis alt går bra, bør du se at den lokale utviklingsserveren ble startet på locahost: 8000. Åpne nettleseren din og navigere der, du bør se Laravels velkomstside:


Nå kan vi fortsette til selve søknaden.

Migrasjoner og modeller

Modeller i Laravel er akkurat som i andre MVC-rammer. Det bruker Eloquent ORM for å lette arbeidet for deg - du vil sannsynligvis aldri trenge å skrive en SQL-spørring igjen (med mindre du vil ha noe som Eloquent ikke støtter). Ved å bruke migreringer kan du endre databasestrukturen med muligheten til å tilbakestille endringer hvis noe går galt. Du kan lese mer om overføringer i dokumentasjonen.

I vår app bruker vi to modeller:

  • Kunde - vil holde kundedataene
  • Transaksjon - vil holde informasjonen om en transaksjon

La oss begynne med å skape migreringer for dem. Hvis du ikke allerede har gjort det, må du slå av serveren vi startet tidligere (Ctrl + C).

kunder

Først påkall denne kommandoen:

php artisan migrere: lag create_customers_table

Dette vil opprette en migreringsfil med en grunnleggende struktur for deg. Gå nå til app / database / vandringer. Det skal være en fil med navnet som begynner med en tidsstempel og slutter med "create_customers_tableLaravel har automatisk opprettet denne grunnleggende strukturen for deg opp() Metoden kalles når migreringen blir brukt, og ned() når den rulles tilbake.

Ring først på Schema :: skape () metode. Det tar to argumenter - skjemaets navn og en tilbakeringingsfunksjon:

Schema :: create ('customers', function ($ table) 

Tilbakeringingen utføres når bordet er opprettet. Tabellobjektet er bestått som $ table variabel og vi manipulerer tabellens struktur ved å bruke den. La oss legge til en automatisk inkrementering id felt:

 $ Table-> trinn ( 'id');

Deretter vil det være tre strengfelter for kundens fornavn, etternavn og e-post:

 $ Bord-> streng ( 'FIRST_NAMEs'); $ Bord-> streng ( 'last_name'); $ Tabell-> string ( 'e') -> unik ();

Vi lager e-post feltet unikt ved å ringe unik() metode på den.

Den siste metoden er for tidsstemplene:

 $ Tabell-> tidsstempler (); );

Dette vil opprette to datafelt i skjemaet: created_at og updated_at. Disse vil bli brukt av Eloquent til å lagre tiden da varen ble opprettet og oppdatert.

Endelig bør koden se slik ut:

offentlig funksjon opp () Schema :: opprette ('kunder', funksjon ($ tabell) $ tabell-> trinn ('id'); $ tabell-> streng ('first_name'); $ table-> string last_name '); $ table-> string (' email ') -> unikt (); $ tabell-> tidsstempel ();); 

De ned() Metoden er mye enklere - det sletter bare skjemaet:

offentlig funksjon ned () Schema :: drop ('kunder'); 

transaksjoner

Koden her vil være lik kundenes en. Først påkalle denne kommandoen:

php artisan migrere: lag create_transactions_table

Finn nå den aktuelle filen i app / database / vandringer og åpne den. Som tidligere, begynn med å lage skjemaet:

Schema :: create ('transaksjoner', funksjon ($ tabell) 

Legg til feltene for id, transaksjonens navn, kostnaden og IDen til kunden den tilhører:

 $ Table-> trinn ( 'id'); $ Tabell-> string ( 'navn'); $ Bord-> flottør ( 'mengde'); $ Bord-> heltall ( 'CUSTOMER_ID');

Og selvfølgelig tidsstemplene:

 $ Tabell-> tidsstempler (); );

Den endelige koden skal se slik ut:

offentlig funksjon opp () Schema :: opprette ('transaksjoner', funksjon ($ tabell) $ tabell-> trinn ('id'); $ tabell-> streng ('navn'); $ table-> float beløp '); $ tabell-> heltall (' customer_id '); $ tabell-> tidsstempel ();); 

Og nå ned() metode:

offentlig funksjon ned () Schema :: drop ('transaksjoner'); 

Databasekonfigurasjon

Nå før du bruker overføringene må du konfigurere tilkoblingen til databasen. Åpne app / config / database.php fil og gå til linje 55. Her er konfigurasjonsdataene for MySQL (det er få andre der inne, for eksempel kan du bruke SQLite eller Postgres):

'mysql' => array ('driver' => 'mysql', // database driver, ikke rør 'host' => 'localhost', // vert for databasen, vanligvis localhost med mindre du har din db på noen server 'database' => 'database', // navn på databasen du skal bruke, den må opprettes tidligere 'brukernavn' => 'root', // brukernavn som skriptet skal bruke for å koble til, anbefaler jeg sterkt bruker root-bruker for dette 'passordet' => ", // passord for brukeren ovenfor, det er bedre å ikke bruke en tom en 'charset' => 'utf8', // koding av db 'collation' => 'utf8_unicode_ci ', // dbs sorteringsinnstilling' prefix '=> ", // prefikset for databastabellene, nyttig hvis du har flere skript som bruker samme database),

Etter at du har fylt det inn, er du god til å gå. Pass på at du lagret filen og påkall denne kommandoen fra appens hovedkatalog (den ene med håndverker filen i den):

php artisan migrere

Og det er det. Hvis det ikke var feil, betyr det at tabellene ble opprettet med hell. Du kan koble til din db ved hjelp av for eksempel phpMyAdmin for å sjekke manuelt hvis du vil.

modeller

I Laravel er det veldig raskt å lage en modell etter at du har konfigurert databasen din ved hjelp av overføringer. Navigere til app / modeller og slett eksemplet User.php fil som er der. Opprett nå to filer med navnet Customer.php og Transaction.php.

La oss begynne med Customer.php. Hver modell i Laravel må utvide Veltalende klasse:

klasse kunden utvider eloquent 

Nå skal vi definere et forhold mellom kunden og deres transaksjoner. Dette gjøres ved å definere en offentlig metode i modellen med navnet på eiendommen vi ønsker å ha i den (i dette tilfellet transaksjoner):

 offentlig funksjonstransaksjoner () 

Nå i funksjonens kropp er det bare en linje:

 returnere $ this-> hasMany ('Transaction'); 

Dette forteller Eloquent at det skal gi alle transaksjoner med Kunde ID av kunden under en eiendom som heter transaksjoner.

Nå skal vi gjøre det samme for transaksjonene, men vi vil reversere forholdet for å gjøre transaksjonens eier tilgjengelig via kunde eiendom:

Klassetransaksjonen utvider Eloquent Public Function kunde () Return $ this-> belongsTo ('Customer'); 

Dette gjøres ved hjelp av $ Dette-> belongsTo () metode av modellen.

Controllers

Nå for å faktisk bruke modellene må vi skape kontroller for dem. Hodet til app / kontrollører katalog, slett HomeController.php bare - BaseController.php er viktig som våre kontrollører vil forlenge den. Opprett nå to filer: CustomerController.php og TransactionController.php.

CustomerController

Denne kontrolleren vil håndtere alt relatert til kundene - legge til, fjerne og vise en liste over dem. Begynn med å definere klassen:

klasse CustomerController utvider BaseController 

Vi bruker Laravel-funksjonen RESTful-kontrollere. Det gjør det enklere å skape ruter fordi vi bare må definere basen URI og Laravel håndterer alt for oss. Dette krever at du starter dine funksjonsnavn med riktig HTTP-verb og fortsetter deretter med undernavnet (ved hjelp av camelCase). Så for eksempel, hvis vi ville ha en metode som heter getNames og basen URI ville være / kunder, da vil metoden være tilgjengelig på / kunder / navn.

De getIndex (), postIndex (), deleteIndex () etc. Metoder vil bli kartlagt til standardruten (i dette tilfellet / kunder).

La oss nå definere vår første rute - få kunden etter deres id:

 offentlig funksjon getIndex () 

La oss få ID fra spørringsparametrene (Laravel gir et fint Input klasse for å håndtere det, så du trenger ikke å bruke $ _GET, $ _POST og $ _files):

 $ id = Input :: get ('id');

Og søk etter brukeren i databasen ved hjelp av dette ID:

 returnere kunde :: finn ($ id); 

Hver metode for kontrolleren må returnere en verdi som er en streng eller har a __toString () metode. I dette tilfellet Kunde Modellen som returneres, vil bli konvertert til JSON før du sender.

Nå kan vi returnere en liste over alle brukere (dette vil være tilgjengelig under / Kunder / alle):

 offentlig funksjon getAll () retur kunde :: alle (); 

Som du kan se, kan vi få alle kunder ved hjelp av modellens alle() metode.

Nå den lengste delen, legger til en ny kunde:

 offentlig funksjon postIndex () 

Først må vi sjekke om all nødvendig informasjon ble gitt. Vi kan gjøre dette ved hjelp av Input :: har () metode:

 hvis (Input :: har ('first_name', 'last_name', 'email')) 

La oss sette alle inntastingsfeltene i $ inngang variabel for å unngå å ringe Input :: får () igjen og igjen. Dette kan gjøres ved hjelp av Input :: alle ():

 $ input = Input :: all ();

Neste vil vi sjekke om noen av inngangene er tomme. Hvis det er tilfelle, returnerer vi en feilmelding med HTTP 400 Feilmelding med en mer oversatt melding:

 hvis ($ input ['first_name'] == "|| $ input ['last_name'] ==" || $ input ['email'] == ") return Response :: make ('Du må fylle alle av inntastingsfeltene ', 400);

Siden vi ønsket å returnere en statuskode enn 200, istedenfor å bare returnere meldingen som en streng, brukte vi Response :: gjøre (), som tar dataene som skal sendes som den første parameteren og statuskoden som den andre. Ta en titt på docs hvis du vil vite mer om svar.

Nå lager vi endelig en ny Kunde modell og mate den med dataene som er oppgitt:

 $ kunde = ny kunde; $ kunde-> first_name = $ input ['first_name']; $ kunde-> last_name = $ input ['last_name']; $ kunde-> email = $ input ['email'];

Deretter kan vi lagre den nyopprettede modellen og svare på forespørselen med den:

 $ Kunde> Lagre (); returner $ kunde;

Her håndterer vi saken hvis ikke alle inngangene ble gitt:

  else return Response :: make ('Du må fylle alle inntastingsfeltene', 400); 

Til slutt trenger vi også muligheten til å fjerne kundene. Denne er veldig kort:

 offentlig funksjon deleteIndex () 

Vi starter med å få kundens ID til å slette:

 $ id = Input :: get ('id');

Deretter søker vi etter og sletter kunden:

 $ kunde = kunde :: finn ($ id); $ Kunde> slett ();

Etter det svarer vi på forespørselen med id oppgitt:

 returner $ id; 

Nå før rutene kan nås, må vi koble dem. Åpne app / routes.php fil, slett alt annet enn kommentaren og legg til denne linjen på slutten av filen:

Route :: controller ('/ customers', 'CustomerController');

Dette vil fortelle Laravel å rute alle forespørsler på / kunder til vår CustomerController. Nå kan du bruke CURL til å spille med det. Start serveren først med php artisan tjene og da kan du for eksempel opprette en kunde:

curl -X POST -d "[email protected]" http: // localhost: 8000 / customers

Deretter kan du få listen over alle kunder:

krølle http: // localhost: 8000 / kunder / alle

TransactionController

Dette, som modellen, ligner veldig på CustomerController. Først oppretter du klassen:

klasse TransactionController utvider BaseController 

La oss da definere metoden for å få alle transaksjoner for en bruker:

 offentlig funksjon getIndex () $ id = Input :: get ('id'); retur Bruker :: finn ($ id) -> transaksjoner; 

Som du kan se bruker vi forholdet som ble definert tidligere for å få transaksjonene (nå tilbakekall spørringen du måtte skrive for å oppnå det samme ved å bruke vanlig PHP og SQL).

Den neste tingen vil være etableringen av transaksjoner:

 offentlig funksjon postIndex () 

Som tidligere kontrollerer vi om all nødvendig informasjon er gitt:

 hvis (Input :: har ('navn', 'beløp')) 

I så fall tilordne den til en $ inngang variabel:

 $ input = Input :: all ();

Sjekk om noen av verdiene som er oppgitt, er tomme, og hvis det er en feil:

 hvis ($ input ['name'] == "|| $ input ['amount'] ==") return Response :: make ('Du må fylle alle inntastingsfeltene', 400); 

Opprett nå transaksjonen og leverer den med all informasjonen som er oppgitt:

 $ transaksjon = ny transaksjon; $ transaction-> name = $ input ['name']; $ transaction-> amount = $ input ['amount'];

Nå må vi legge den til riktig kunde. La oss finne dem med det oppgitte id og legge til $ transaksjon til deres transaksjonsliste:

 $ id = $ input ['customer_id']; Bruker :: finne ($ id) -> transactions-> Lagre ($ transaksjon);

Dette gjøres ved hjelp av transactions-> Lagre () metode gitt av Laravel. Nå kan vi svare med den opprettede transaksjonen:

 returnere $ transaksjon;

Og håndter saken der ingen eller ikke alle dataene ble oppgitt:

  else return Response :: make ('Du må fylle alle inntastingsfeltene', 400); 

Deretter er det også en metode for å slette transaksjonen på samme måte som vi slettet kunden:

 offentlig funksjon deleteIndex () $ id = Input :: get ('id'); $ transaction = Transaction :: finn ($ id); $ Transaksjons> slett (); returner $ id; 

Legg nå bare ruten og du kan teste kontrolleren ved hjelp av CURL:

Rute :: kontroller ('/ transaksjoner', 'TransactionController');

Konklusjon

Ok, dette er slutten på første del - i den andre delen av denne opplæringen vil vi skape forkant med AngularJS. Du er velkommen til å legge til flere funksjoner i appen din (for eksempel redigering av kunder eller sortering), hvis du ikke fant informasjonen du lette etter, ta en titt på Laravels dokumentasjon.