Pakkeforvaltning i Laravel

I denne artikkelen vil vi gå videre og utforske pakkehåndteringsfunksjonen i Laravel-rammeverket. I løpet av artikkelen vil vi gå gjennom et ekteeksempel for å demonstrere formålet med artikkelen.

Pakkebehandling i Laravel er en viktig funksjon som lar deg pakke inn en del funksjonalitet slik at den kan distribueres enkelt. Videre kan du alltid publisere pakken din til repositorier som Packagist og GitHub som tillater andre utviklere å dra nytte av pakken din.

For å demonstrere konseptet, bygger vi en eksempelside i Laravel som laster opp et bilde til Amazon S3-skyen. I stedet for å gå med den vanlige strømmen, utvikler vi den som en pakket pakke som kan distribueres og vedlikeholdes enkelt.

Før du går videre antar jeg at du er kjent med Laravel-rammen allerede, da jeg ikke vil gå inn i detaljene i grunnleggende Laravel-konsepter.

Du må også ha en gyldig AWS-konto og legitimasjonene for å få tilgang til Amazon API for å følge med eksemplet i denne artikkelen. Så sørg for at du setter det opp først.

Med alt på hånden er vi klare til å dykke inn i selve utviklingen.

Sette opp pakkefilene

La oss raskt se på listen over filer som vi skal gjennomføre gjennom hele løpet av denne opplæringen.

  • composer.json: Vi må legge til klassekartlegging av pakken i eksisterende composer.json fil i roten av pakken.
  • config / app.php: Dette er den eksisterende filen som vi skal bruke for å legge til en oppføring av vår tilpassede tjenesteleverandør slik at vi kan laste inn visninger og ruter ved hjelp av den filen.
  • composer.json: Dette er pakkspesifikke composer.json fil hvis du ønsker å distribuere pakken med andre.
  • pakker / Envato / AWS / src / Leverandører / AwsServiceProvider.php: Den vanlige Laravel-tjenesteleverandøren filen som vil bli brukt til å laste inn andre komponenter i pakken.
  • pakker / Envato / AWS / src / ruter / web.php: Den laster de tilpassede ruter av pakken vår.
  • pakker / Envato / AWS / src / overvåkning / AwsController.php: Dette er kontrollerfilen som håndterer programlogikken til pakken.
  • pakker / Envato / AWS / src / visninger / upload.blade.php: Visningsfilen som håndterer gjengivelseslogikken.

Ikke bekymre deg hvis det ikke gir mye mening enda, siden vi diskuterer alt i detalj når vi går gjennom det.

Sette opp forutsetningene

Som vi diskuterte tidligere, implementerer pakken vår brukssaken til filopplasting til Amazon S3-skyen. I denne delen går vi gjennom forutsetningene som må settes opp for å kunne kjøre pakken vellykket.

Som Laravel-utvikler må du være kjent med Flysystem, som gir et fint abstraksjonslag for å samhandle med filsystemet. Det gir enkle å bruke drivere, slik at du enkelt kan samhandle med det, uansett hvilken type filsystem du har å håndtere - enten det er det lokale filsystemet eller AWS S3-skyvesystemet.

For å kunne støtte Amazon S3 cloud filsystem med Flysystem, må du installere den tilsvarende adapterkomponenten.

Gå videre og kjør følgende komponentkommando fra prosjektrotten din for å installere flysystem-aws-s3-v3-pakken.

$ komponist krever liga / flysystem-aws-s3-v3

Ved vellykket utførelse av den kommandoen, kan du nå bruke Laravel Flysystem til å samhandle med Amazon S3 cloud filsystem på samme måte som du ville ha brukt det til det lokale filsystemet.

La oss nå raskt trekke inn config / filesystems.php fil for å se innstillingene for Amazon S3 filsystem.

... 'disker' => ['lokal' => ['driver' => 'lokal', 'root' => storage_path ('app'),], 'public' => ['driver' => 'lokal' , 'root' = 'storage_path (' app / public '),' url '=> env (' APP_URL ').' / lagring ',' synlighet '=>' offentlig ',],' s3 '=> driver '=>' s3 ',' nøkkel '=> env (' AWS_KEY '),' hemmelig '=> env (' AWS_SECRET '),' region '=> env (' AWS_REGION '),' bøtte '=> env ('AWS_BUCKET'),],], ... 

Som du kan se er konfigurasjonen allerede på plass for Amazon S3; Det er bare det vi må sette hensiktsmessig ENV variabler i .env fil.

Gå videre og legg til følgende variabler i din .env fil.

AWS_KEY = AWS_KEY_VALUE AWS_SECRET = AWS_SECRET_VALUE AWS_REGION = AWS_REGION_VALUE AWS_BUCKET = AWS_BUCKET_VALUE AWS_CDN_URL = AWS_CDN_URL_VALUE

Selvfølgelig må du erstatte plassholdere med de faktiske verdiene. Nå er du klar til å bruke Flysystem AWS S3-adapteren i Laravel-programmet.

Går gjennom pakkefiler

For å lage din egen Laravel-pakke, er det første å lage en passende katalogstruktur som gjenspeiler konvensjonene i Laravel-systemet. Jeg antar at du allerede kjører et grunnleggende Laravel-program; faktisk, standard blog søknad vil gjøre så godt.

Gå videre og opprett pakker katalog i roten til søknaden din. Med tanke på at du skal distribuere pakken din med andre, bør den foretrukne strukturen til pakken være VENDOR_NAME / pakke.

Etter denne konvensjonen, la oss gå videre og opprette en Envato / AWS katalog under pakker katalogen. Som du kanskje har gjettet, Envato er leverandørens navn og AWS står for pakkenavnet selv. Til slutt, la oss lage en pakker / Envato / AWS / src katalog som inneholder kildefilene i pakken vår.

Nå må vi informere Laravel om vår nye pakke. Gå videre og åpne composer.json filen i roten av Laravel-søknaden din og legg til "Envato \\ Aws \\": "pakker / envato / aws / src" oppføring i autoload-delen som vist nedenfor.

... "autoload": "klassekart": ["database"], "psr-4": "App \\": "app /", "Envato \\ Aws \\": "pakker / envato / aws / src ", ... 

Som du kan se, er Envato \ Aws \ namespace er kartlagt til pakker / Envato / AWS / src katalogen. Nå trenger vi bare å kjøre dump-autoload-kommandoen for å regenerere komponentmappingene.

$ komponent dump-autoload

Nå kan du bruke Envato \ Aws \ namespace i søknaden din og det henter filene fra riktig sted!

Komponist Fil av pakken

Nå, la oss gå videre og legge til en pakke-spesifikk composer.json fil slik at du kan distribuere pakken din til pakkelageret.

Gå til pakker / Envato / AWS katalog og kjør følgende kommando for å generere en composer.json fil for pakken din.

$ komponent init

Du blir bedt om de vanlige spørsmålene, så bare gå gjennom det, og det vil skape en composer.json fil.

I det minste bør det se noe ut som dette.

"navn": "envato / aws", "beskrivelse": "Eksempel på filopplasting til AWS S3 Cloud", "minimumstabilitet": "dev", "require":  

Rute

I vår pakke lager vi en enkel side som viser statusen til den opplastede filen. Så vi må opprette en rute som er knyttet til den siden.

La oss lage en rutefil på pakker / Envato / AWS / src / ruter / web.php.

Krever det noen forklaring i det hele tatt? Det åpenbare neste trinnet er å opprette tilhørende kontrollerfilen.

Controller

La oss lage en kontrollerfil på pakker / Envato / AWS / src / overvåkning / AwsController.php med følgende innhold.

skive ( 's3'); // last lokal lagring $ localStorage = $ storage-> disk ('local'); // standard banen for lokal lagring "lagring / app" $ sourceFileContents = $ localStorage-> get ('test.jpg'); // destinasjonsfilepath i S3 cloud $ destFilePath = 'test_new.jpg'; // init vars $ imageUrl = "; $ errorMsg ="; // laste fil til AWS S3 hvis ($ awsS3Storage-> put ($ destFilePath, $ sourceFileContents, 'public')) $ imageUrl = env ('AWS_CDN_URL'). env ('AWS_BUCKET'). '/'. $ DestFilePath;  else $ errorMsg = 'Ups! Noe gikk galt :( '; // Tilbakemeldingsvisning for anropsvisning (' aws :: upload ', [' imageUrl '=> $ imageUrl,' errorMsg '=> $ errorMsg]); 

La oss gå gjennom filen for å forstå hva hvert stykke kode er ment for.

Vi sparker av tingene ved å sette inn et navneområde for vår kontroller til navneområdet Envato \ Aws \ Controllers. Husk at vi la til kartlegging av Envato \ Aws til pakker / Envato / AWS / src i roten composer.json filen slik at den kunne finne våre pakkefiler.

Deretter har vi definert laste opp metode som gjør det nødvendig å synkronisere lokale filer til Amazon S3-skyen. Det viktige å merke seg her er det første argumentet for opplastingsmetoden som ber om \ Belyse \ Kontrakter \ filsystem \ Factory avhengighet. Under gjennomføringen vil den aktuelle Laravel kontrakten bli injisert.

Nå kan vi bruke filsystemfabrikken til å lage diskinstanser etter behov. Skiveksemplet i Laravel er driveren som gir deg enkel tilgang til underliggende filsystemer som den lokale disken, Amazon S3-skyen og lignende.

// last s3 lagring $ awsS3Storage = $ storage-> disk ('s3'); // last lokal lagring $ localStorage = $ storage-> disk ('local');

For enkelhets skyld overfører vi den statiske bildefilen som allerede er tilgjengelig under standard lokal lagring av Laravel, og banen er lagring / app / test.jpg.

Som et første skritt, la oss ta tak i kildefilens innhold.

// standard banen for lokal lagring "lagring / app" $ sourceFileContents = $ localStorage-> get ('test.jpg'); 

Med alt satt opp som nevnt, bør du kunne synkronisere en fil til Amazon S3 ved hjelp av put-metoden.

// laste fil til AWS S3 hvis ($ awsS3Storage-> put ($ destFilePath, $ sourceFileContents, 'public')) $ imageUrl = env ('AWS_CDN_URL'). env ('AWS_BUCKET'). '/'. $ DestFilePath;  else $ errorMsg = 'Ups! Noe gikk galt :(';  

Pass på at du har satt AWS-miljøvariablene riktig, bare hvis noe ikke fungerer som forventet.

Og det siste er å ringe en visningsfil som viser det synkroniserte bildet og en passende melding.

// Tilbakemeldingsvisning for anropsvisning ('aws :: upload', ['imageUrl' => $ imageUrl, 'errorMsg' => $ errorMsg]); 

Selvfølgelig har vi ikke opprettet en visningsfil enda, og det er akkurat hva den neste delen handler om.

Utsikt

La oss lage en visningsfil på pakker / Envato / AWS / src / visninger / upload.blade.php med følgende innhold.

      Laravel       
@if (Rute :: har ('logg inn'))
@if (Auth :: sjekk ()) Hjem @else Logg inn Registrer @endif
@slutt om
Filopplasting til S3 Cloud
@if ($ imageUrl) @ellers $ errorMsg @slutt om

Det er en ganske standard visning fil som viser det opplastede bildet ved vellykket opplasting, eller på annen måte en passende feilmelding.

Tjenesteleverandør

Vi er nesten ferdige med pakken vår som vi har opprettet de nødvendige filene. Det neste trinnet er å skape en tjenesteleverandør slik at vi kan registrere ruter og visninger av pakken vår.

La oss lage en tjenesteleverandørfil på pakker / Envato / AWS / src / Leverandører / AwsServiceProvider.php med følgende innhold.

loadRoutesFrom (__ DIR __. '/ ... /routes/web.php'); // laste vise filer $ this-> loadViewsFrom (__ DIR __. '/ ... / views', 'aws'); // publiser filer $ this-> publiserer ([__DIR __. '/ ... / views' => resource_path ('views / vendor / aws'),]);  / ** * Registrer søknadstjenestene. * * @return void * / public function register ()  

Selvfølgelig kunne du ha opprettet tjenesteleverandørfilen ved å bruke artisan-kommandoen også. Men det ville ha krevd et ekstra trinn for å flytte filen fra app / Leverandører til vår pakke.

Uansett, la oss gå gjennom tjenesteleverandørfilen som nettopp ble opprettet.

For det første laster vi ruter og visninger som er knyttet til vår pakke.

// last ruter $ this-> loadRoutesFrom (__ DIR __. '/ ... /routes/web.php'); // laste vise filer $ this-> loadViewsFrom (__ DIR __. '/ ... / views', 'aws'); 

Deretter gir vi støtte til å publisere visningene av våre pakker, slik at utviklerne som vil overstyre visningene, kan gjøre det. Neste gang kjører de php artisan leverandør: publisere kommando, kopierer Laravel visningen fra pakker / Envato / AWS / src / visninger / til ressurser / visninger / leverandør / AWS.

Nå kan de endre visningene under ressurser / visninger / leverandør / AWS katalog, og det vil bli hentet automatisk av Laravel i stedet for visningene under pakker / Envato / AWS / src / visninger /. Faktisk er det den riktige måten å modifisere tredjepartspakkevisninger, i stedet for direkte å endre pakkevisningene.

Det er så langt som tjenesteleverandøren er opptatt av. Som du ville ha forventet, må vi legge til tjenesteleverandørinngangen i config / app.php. Legg til følgende oppføring i tilbydere matrise.

... / * * Applikasjonsleverandører ... * / App \ Providers \ AppServiceProvider :: klasse, App \ Providers \ AuthServiceProvider :: klasse, App \ Providers \ BroadcastServiceProvider :: klasse, App \ Providers \ EventServiceProvider :: klasse, App \ Providers \ RouteServiceProvider :: klasse, Envato \ Aws \ Providers \ AwsServiceProvider :: klasse, // Vår pakkeleverandør ... 

Og der er du - alt er i orden nå, slik at vi kan fortsette og teste vår pakke.

Gå videre og kjør http: // din-laravel-applikasjon / aws / s3 / opplastingsadresse i nettleseren din. Hvis alt går bra, bør du se bildet på siden din som er lastet fra Amazon S3-skyen. Gi meg beskjed hvis du står overfor eventuelle problemer, og jeg vil gjerne svare på disse.

Så vi er på slutten av denne artikkelen, og jeg håper du har hatt det!

Konklusjon

I dag diskuterte vi en av de viktige funksjonene i Laravel Framework-Package Management. I ferd med å sette opp vår egendefinerte Laravel-pakke, gikk vi gjennom et eksempel på ekte verden som viste hvordan du kan laste opp et bilde til Amazon S3-skyen.

Det er en veldig fin funksjon hvis du ønsker å pakke sammen og distribuere et sett med funksjoner sammen. Faktisk kan du se på dette som et alternativ for å nærme seg din tilpassede modulutvikling i Laravel.

For de av dere som enten bare er i gang med Laravel eller ønsker å utvide din kunnskap, nettsted eller søknad med utvidelser, har vi en rekke ting du kan studere på Envato Market.

Som alltid kan du legge igjen dine verdifulle kommentarer og tilbakemeldinger i fôret nedenfor!