Pakketbeheer in Laravel

In dit artikel gaan we verder en onderzoeken we de pakketbeheerfunctie in het Laravel-framework. In de loop van het artikel zullen we een voorbeeld uit de praktijk bekijken om het doel van het artikel te demonstreren.

Pakketbeheer in Laravel is een belangrijke functie waarmee u een stuk functionaliteit kunt bundelen zodat het gemakkelijk kan worden gedistribueerd. Bovendien zou je jouw pakket altijd kunnen publiceren naar repositories zoals Packagist en GitHub waarmee andere ontwikkelaars kunnen profiteren van jouw pakket.

Om het concept te demonstreren, bouwen we een voorbeeldpagina in Laravel die een afbeelding uploadt naar de Amazon S3-cloud. In plaats van te gaan met de gebruikelijke stroom, zullen we het ontwikkelen als een gebundeld pakket dat gemakkelijk kan worden gedistribueerd en onderhouden.

Voordat ik verder ga, neem ik aan dat je al bekend bent met het Laravel-raamwerk, aangezien ik niet inga op de details van de basisconcepten van Laravel.

U moet ook een geldig AWS-account en de inloggegevens hebben om toegang te krijgen tot de Amazon API om samen met het voorbeeld in dit artikel te volgen. Dus zorg ervoor dat je dat eerst instelt.

Met alles bij de hand zijn we klaar om een ​​duik te nemen in de daadwerkelijke ontwikkeling.

De pakketbestanden instellen

Laten we snel kijken naar de lijst met bestanden die we in de loop van deze zelfstudie zullen implementeren.

  • composer.json: We moeten de class mapping van ons pakket toevoegen aan het bestaande composer.json bestand in de root van het pakket.
  • config / app.php: Dit is het bestaande bestand dat we zullen gebruiken om een ​​vermelding van onze aangepaste serviceprovider toe te voegen, zodat we weergaven en routes kunnen laden met dat bestand.
  • composer.json: Dit is de pakketspecifieke composer.json bestand wilt u het pakket met anderen verspreiden.
  • packages / Envato / AWS / src / Providers / AwsServiceProvider.php: Het gebruikelijke Laravel-serviceproviderdossier dat zal worden gebruikt om andere componenten van het pakket te laden.
  • packages / Envato / AWS / src / routes / web.php: Het laadt de aangepaste routes van ons pakket.
  • packages / Envato / AWS / src / Controllers / AwsController.php: Dit is het controllerbestand dat de toepassingslogica van ons pakket afhandelt.
  • packages / Envato / AWS / src / views / upload.blade.php: Het weergavebestand dat de renderinglogica verwerkt.

Maak je geen zorgen als het nog niet veel zin heeft, want we zullen alles in detail bespreken terwijl we het doornemen.

De vereisten instellen

Zoals we eerder hebben besproken, implementeert ons pakket het gebruik van het uploaden van bestanden naar de Amazon S3-cloud. In dit gedeelte bekijken we de vereisten die moeten worden ingesteld om ons pakket met succes te kunnen uitvoeren.

Als Laravel-ontwikkelaar moet je bekend zijn met Flysystem, dat een mooie abstractielaag biedt om te communiceren met het bestandssysteem. Het biedt eenvoudig te gebruiken stuurprogramma's zodat u er gemakkelijk mee kunt werken, ongeacht het type bestandssysteem waarmee u te maken hebt - het is het lokale bestandssysteem of het AWS S3-cloudsysteem.

Om de ondersteuning van het Amazon S3 cloudbestandssysteem met Flysystem mogelijk te maken, moet u het corresponderende pakket adaptercomponenten installeren.

Ga je gang en voer de volgende composer-opdracht uit vanuit je projectroot om het pakket flysystem-aws-s3-v3 te installeren.

$ componist vereist competitie / flysystem-aws-s3-v3

Na de succesvolle uitvoering van dat commando, kun je nu Laravel Flysystem gebruiken om te communiceren met Amazon S3 cloudbestandssysteem op dezelfde manier als je het zou hebben gebruikt voor het lokale bestandssysteem.

Laten we nu snel aan de slag config / filesystems.php bestand om de instellingen voor het Amazon S3-bestandssysteem te bekijken.

... 'disks' => ['local' => ['driver' => 'lokaal', 'root' => storage_path ('app'),], 'public' => ['driver' => 'lokaal' , 'root' => storage_path ('app / public'), 'url' => env ('APP_URL'). '/ storage', 'visibility' => 'public',], 's3' => [' stuurprogramma '=>' s3 ',' key '=> env (' AWS_KEY '),' secret '=> env (' AWS_SECRET '),' region '=> env (' AWS_REGION '),' bucket '=> env ('AWS_BUCKET'),],], ... 

Zoals u kunt zien, is de configuratie al op zijn plaats voor de Amazon S3; het is alleen dat we het gepaste moeten instellen ENV variabelen in de .env het dossier.

Ga je gang en voeg de volgende variabelen toe in je .env het dossier.

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

Natuurlijk moet u tijdelijke aanduidingen vervangen door hun werkelijke waarden. Nu bent u klaar om de Flysystem AWS S3-adapter te gebruiken in uw Laravel-toepassing.

Door de pakketbestanden gaan

Om uw eigen Laravel-pakket te maken, moet u eerst een geschikte directorystructuur maken die de conventies van het Laravel-systeem weerspiegelt. Ik neem aan dat je al een eenvoudige Laravel-applicatie gebruikt; in feite is de standaard blog toepassing zal het ook goed doen.

Ga je gang en maak de pakketjes map in de hoofdmap van uw toepassing. Gezien het feit dat u uw pakket met anderen gaat verspreiden, zou de voorkeursstructuur van uw pakket moeten zijn VENDOR_NAME / package_name.

Volgens die conventie gaan we door en maken we een Envato / aws map onder de pakketjes directory. Zoals je misschien al geraden, Envato is de naam van de leverancier, en aws staat voor de pakketnaam zelf. Laten we tot slot een maken packages / Envato / AWS / src map die de bronbestanden van ons pakket bevat.

Nu moeten we Laravel informeren over ons nieuwe pakket. Ga je gang en open de composer.json bestand in de root van uw Laravel-toepassing en voeg de "Envato \\ Aws \\": "packages / envato / aws / src" invoer in de autoload-sectie zoals hieronder getoond.

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

Zoals u kunt zien, de Envato \ Aws \ naamruimte is toegewezen aan de packages / Envato / AWS / src directory. Nu moeten we alleen de opdracht dump-autoload uitvoeren om de composiettoewijzingen opnieuw te genereren.

$ composer dump-autoload

Nu kunt u de Envato \ Aws \ naamruimte in uw toepassing en het haalt de bestanden op vanaf de juiste locatie!

Composer-bestand van het pakket

Laten we nu een pakketspecifiek toevoegen composer.json bestand, zodat u uw pakket naar de packagist-repository kunt distribueren.

Ga naar de packages / Envato / aws map en voer de volgende opdracht uit om een ​​te genereren composer.json bestand voor uw pakket.

$ composer init

U zult de gebruikelijke vragen krijgen, dus ga er gewoon doorheen en het zal een composer.json het dossier.

Op zijn minst zou het er ongeveer zo uit moeten zien.

"name": "envato / aws", "description": "Voorbeeld van het uploaden van bestanden naar AWS S3 Cloud", "minimum-stabiliteit": "dev", "require":  

Route

In ons pakket maken we een eenvoudige pagina met de status van het geüploade bestand. We moeten dus een route maken die aan die pagina is gekoppeld.

Laten we een routebestand maken op packages / Envato / AWS / src / routes / web.php.

Heeft het enige uitleg nodig? De voor de hand liggende volgende stap is om het bijbehorende controllerbestand aan te maken.

controleur

Laten we een controllerbestand maken op packages / Envato / AWS / src / Controllers / AwsController.php met de volgende inhoud.

disk ( 's3'); // laad lokale opslag $ localStorage = $ storage-> disk ('local'); // standaard pad van lokale opslag "opslag / app" $ sourceFileContents = $ localStorage-> get ('test.jpg'); // bestemmingsmappad in S3 cloud $ destFilePath = 'test_new.jpg'; // init vars $ imageUrl = "; $ errorMsg ="; // upload het bestand naar AWS S3 if ($ awsS3Storage-> put ($ destFilePath, $ sourceFileContents, 'public')) $ imageUrl = env ('AWS_CDN_URL'). env ('AWS_BUCKET'). '/'. $ DestFilePath;  else $ errorMsg = 'Oeps! Er is iets fout gegaan :( '; // weergave oproepweergave retourneren (' aws :: upload ', [' imageUrl '=> $ imageUrl,' errorMsg '=> $ errorMsg]); 

Laten we het bestand doornemen om te begrijpen waarvoor elk stuk code is bedoeld.

We beginnen met de dingen door een naamruimte in te stellen voor onze controller in de naamruimte Envato \ Aws \ Controllers. Bedenk dat we de toewijzing van hebben toegevoegd Envato \ Aws naar packages / Envato / AWS / src in de root composer.json bestand zodat het onze pakketbestanden kon vinden.

Vervolgens hebben we de uploaden methode die het nodig maakt om lokale bestanden naar de Amazon S3-cloud te synchroniseren. Het belangrijkste om hier op te merken is het eerste argument van de uploadmethode die vraagt ​​naar de \ Illuminate \ contracten \ bestandssysteem \ Factory afhankelijkheid. Tijdens de uitvoering zal het juiste Laravel-contract worden geïnjecteerd.

Nu kunnen we de fabriekssysteeminstantie van het bestandssysteem gebruiken om zo nodig schijfinstanties te maken. De schijfinstantie in Laravel is de driver waarmee je eenvoudig toegang hebt tot onderliggende bestandssystemen, zoals de lokale schijf, de Amazon S3-cloud en dergelijke.

// load s3 storage $ awsS3Storage = $ storage-> disk ('s3'); // laad lokale opslag $ localStorage = $ storage-> disk ('local');

Voor de eenvoud zullen we het statische afbeeldingsbestand dat al beschikbaar is onder de standaard lokale opslag van Laravel overbrengen en het pad is dat opslag / app / test.jpg.

Laten we als eerste stap de inhoud van het bronbestand pakken.

// standaard pad van lokale opslag "opslag / app" $ sourceFileContents = $ localStorage-> get ('test.jpg'); 

Met alles dat is ingesteld zoals vermeld, zou je een bestand met Amazon S3 kunnen synchroniseren met behulp van de put-methode.

// upload het bestand naar AWS S3 if ($ awsS3Storage-> put ($ destFilePath, $ sourceFileContents, 'public')) $ imageUrl = env ('AWS_CDN_URL'). env ('AWS_BUCKET'). '/'. $ DestFilePath;  else $ errorMsg = 'Oeps! Er is iets fout gegaan :(';  

Zorg ervoor dat u de AWS-omgevingsvariabelen correct hebt ingesteld, voor het geval iets niet werkt zoals verwacht.

En het laatste is om een ​​weergavebestand te openen dat de gesynchroniseerde afbeelding en een passend bericht weergeeft.

// call view return view ('aws :: upload', ['imageUrl' => $ imageUrl, 'errorMsg' => $ errorMsg]); 

Natuurlijk hebben we nog geen zichtbestand gemaakt, en dat is precies waar het volgende deel over gaat.

Uitzicht

Laten we een weergavebestand maken op packages / Envato / AWS / src / views / upload.blade.php met de volgende inhoud.

      Laravel       
@if (Route :: has ('login'))
@if (Auth :: check ()) Home @else Inloggen Registreren @endif
@stop als
Bestand uploaden naar S3 Cloud
@if ($ imageUrl) @anders $ errorMsg @stop als

Het is een vrij standaard weergavebestand dat de geüploade afbeelding laat zien na de succesvolle upload, of anders een passende foutmelding.

Dienstverlener

We zijn bijna klaar met ons pakket omdat we de benodigde bestanden hebben gemaakt. De volgende stap is om een ​​serviceprovider te maken zodat we de routes en weergaven van ons pakket kunnen registreren.

Laten we een serviceproviderbestand maken op packages / Envato / AWS / src / Providers / AwsServiceProvider.php met de volgende inhoud.

loadRoutesFrom (__ DIR __. '/ ... /routes/web.php'); // laad weergavebestanden $ this-> loadViewsFrom (__ DIR __. '/ ... / views', 'aws'); // publiceer bestanden $ this-> publiceert ([__DIR __. '/ ... / views' => resource_path ('views / vendor / aws'),]);  / ** * Registreer de applicatieservices. * * @return void * / public function register ()  

Het is duidelijk dat je het serviceproviderdossier ook hebt kunnen maken met behulp van de artisan-opdracht. Maar het zou een extra stap vereisen om het bestand te verplaatsen app / Providers naar ons pakket.

Hoe dan ook, laten we door het serviceproviderbestand gaan dat zojuist was gemaakt.

Eerst laden we de routes en views in die bij ons pakket horen.

// laad routes $ this-> loadRoutesFrom (__ DIR __. '/ ... /routes/web.php'); // laad weergavebestanden $ this-> loadViewsFrom (__ DIR __. '/ ... / views', 'aws'); 

Vervolgens bieden we de ondersteuning voor het publiceren van de weergaven van onze pakketten, zodat de ontwikkelaars die de opvattingen willen negeren, dat kunnen doen. De volgende keer dat ze de php artisan verkoper: publiceren commando, Laravel kopieert de views van packages / Envato / AWS / src / views / naar resources / views / verkoper / aws.

Nu kunnen ze de weergaven onder de wijzigen resources / views / verkoper / aws directory, en deze wordt automatisch opgehaald door Laravel in plaats van de onderstaande views packages / Envato / AWS / src / views /. In feite is dit de juiste manier om pakketweergaven van derden aan te passen, in plaats van de pakketaanzichten direct aan te passen.

Dat is het voor zover het de dienstverlener betreft. Zoals u had verwacht, moeten we het nummer van de serviceprovider toevoegen config / app.php. Voeg de volgende vermelding toe in de providers rangschikking.

... / * * Application Service Providers ... * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, Envato \ Aws \ Providers \ AwsServiceProvider :: class, // Onze pakketdienstverlener ... 

En daar ben je - alles is nu in orde, zodat we ons pakket kunnen testen.

Ga je gang en voer de http: // jouw-laravel-applicatie / aws / s3 / upload-URL uit in je browser. Als alles goed gaat, ziet u de afbeelding op uw pagina die is geladen vanuit de Amazon S3-cloud. Laat het me weten als u problemen ondervindt, en ik beantwoord ze graag.

Dus we staan ​​op de slotnotitie van dit artikel en ik hoop dat je ervan hebt genoten!

Conclusie

Vandaag hebben we gesproken over een van de belangrijke kenmerken van het Laravel-raamwerkpakketbeheer. Bij het opzetten van ons aangepaste Laravel-pakket hebben we een voorbeeld uit de praktijk doorgenomen dat aantoonde hoe je een afbeelding kon uploaden naar de Amazon S3-cloud.

Het is echt een leuke functie als je een aantal functionaliteiten samen wilt bundelen en distribueren. In feite zou u dit kunnen beschouwen als een optie om uw aangepaste moduleontwikkeling in Laravel te benaderen.

Voor degenen onder u die net zijn begonnen met Laravel of die op zoek zijn om uw kennis, site of applicatie uit te breiden met uitbreidingen, hebben wij een aantal dingen die u kunt bestuderen op Envato Market.

Zoals altijd kunt u uw waardevolle opmerkingen en feedback achterlaten in de onderstaande feed!