Управління пакетами в Laravel

387

Від автора: у цій статті ми розглянемо , як управляються Laravel пакети. В ході статті ми розглянемо реальний приклад, щоб продемонструвати мета статті. Управління пакетами в Laravel — важлива функція, яка дозволяє об’єднати і розподілити функціональність. Крім того, можна опублікувати свій пакет в сховищах начебто Packagist і GitHub, це дозволить іншим розробникам отримати користь з вашого пакета.

Щоб продемонструвати концепцію, для прикладу ми створимо сторінку в Laravel, яка завантажує зображення в хмару Amazon S3. Замість того, щоб йти зі звичайним потоком, ми розробимо його як пакет, який можна легко розподіляти і підтримувати.

Перш ніж рухатися далі, я розраховую, що ви вже знайомі з базою Laravel, оскільки я не буду вдаватися в подробиці основних концепцій Laravel.

Крім того, вам необхідно мати дійсний обліковий запис AWS і облікові дані для доступу до API Amazon, щоб слідувати разом з прикладом у цій статті. Отже, переконайтеся, що все це у вас є. Тепер ми готові зануритися у вивчення.

Налаштування файлів пакетів

Давайте швидко розглянемо список файлів, які ми будемо впроваджувати на протязі всього уроку.

composer.json: Нам потрібно додати зіставлення класів нашого пакету в існуючий composer.json файл в кореневому каталозі.

config/app.php: Це існуючий файл, який ми будемо використовувати для додавання запису нашого інтерфейсу постачальника послуг, щоб завантажувати подання та маршрути з використанням цього файлу.

composer.json: Це пакетний composer.јѕопфайл, якщо ви хочете поширювати пакет разом з іншими.

packages/envato/aws/src/Providers/AwsServiceProvider.php: Звичайний файл постачальника послуг Laravel, який буде використовуватися для завантаження інших компонентів пакету.

packages/envato/aws/src/routes/web.php: Завантажує користувальницькі маршрути пакета.

packages/envato/aws/src/Controllers/AwsController.php: Це файл контролера, який обробляє логіку програми.

packages/envato/aws/src/views/upload.blade.php: Файл подання, який обробляє логіку рендеринга.

Не хвилюйтеся, якщо це не має для вас особливого сенсу, оскільки ми ще все це докладно обговоримо. Як ми обговорювали раніше, наш пакет реалізує процес завантаження файлів в хмару Amazon S3. У цьому розділі ми розглянемо попередні умови, які необхідно налаштувати для успішного запуску нашого пакету.

Як розробник, ви повинні бути знайомі з Flysystem, яка забезпечує хороший рівень абстракції для взаємодії з файловою системою. Він надає прості у використанні драйвери, щоб ви могли легко взаємодіяти з ним незалежно від типу файлової системи, з якою ви маєте справу: чи це локальна файлова система, або хмарна система AWS S3.

Щоб включити підтримку хмарної файлової системи Amazon S3 з допомогою Flysystem, вам необхідно встановити відповідний пакет адаптер.

Для запуску пакета flysystem-aws-s3-v3 виконайте команду компілятора з кореневого каталогу проекту.

$composer require league/flysystem-aws-s3-v3

Після успішного виконання цієї команди тепер ви можете використовувати Laravel Flysystem для взаємодії з хмарної файловою системою Amazon S3 так само, як ви використали б її для локальної файлової системи.

Тепер давайте швидко потягнемо за config/filesystems.php файл, щоб побачити налаштування, надані для файлової системи Amazon S3.



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

Як ви можете бачити, конфігурація вже встановлена для Amazon S3; просто потрібно встановити відповідні ENV змінні .env файл.

Йдемо далі і додаємо в .env файл наступні змінні.

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}

Звичайно, потрібно замінити заповнювачі їх фактичними значеннями. Тепер можна використовувати адаптер Flysystem AWS S3 у своєму додатку Laravel.

Перехід через файли пакета

Щоб створити свій власний пакет Laravel, потрібно створити відповідну структуру каталогів, яка відповідає угодам системи Laravel. Я припускаю, що ви вже використовуєте базове додаток Laravel; тому що додаток за замовчуванням для блогу теж буде працювати.

Йдемо далі і створюємо каталог packages в корені вашого додатка. Враховуючи, що ми плануємо поширювати свій пакет з іншими, краща структура пакету повинна бути {vendor_name}/{package_name}.

Дотримуючись цієї угоди, створимо envato/aws каталог під каталогом packages. Як ви, можливо, здогадалися, envato це ім’я постачальника і aws позначає назва пакету. Нарешті, створимо каталог packages/envato/aws/src, що містить вихідні файли нашого пакету.

Тепер нам потрібно повідомити Laravel про нашому новому пакеті. Відкриваємо файл composer.json в корені додатки Laravel і додаємо запис «Envato\\Aws\\»: «packages/envato/aws/src» у розділ автозавантаження, як показано нижче.



“autoload”: {
“classmap”: [
“database”
],
“psr-4”: {
“App\\”: “app/”,
“Envato\\Aws\\”: “packages/envato/aws/src”
}
},

Як можна побачити, простір імен Envato\Aws\ відображається в packages/envato/aws/ѕгскаталог. Тепер нам просто потрібно запустити команду dump-autoload для відновлення композиційних зіставлень.

$composer dump-autoload

Тепер ви можете використовувати простір імен Envato\Aws\ у своєму додатку, і він підбере файли з правильного місця!

Файл композиції пакету

Тепер давайте додамо специфічний для пакета файл composer.json, щоб була можливість поширювати свій пакет в репозиторії packagist. Перейдіть в packages/envato/aws каталог і виконайте наступну команду для створення composer.json файлу.

$composer init

Вам будуть задані звичайні питання, просто пройдіть їх, і файл composer.json буде створений. Він повинен виглядати приблизно так.

{
“name”: “envato/aws”,
“description”: “Example of File Upload to AWS S3 Cloud”,
“minimum-stability”: “dev”,
“require”: {}
}

Маршрут

У пакеті ми створимо просту сторінку, що відображає статус завантаженого файлу. Тому нам потрібно створити маршрут, пов’язаний з цією сторінкою. Давайте створимо файл маршруту в packages/envato/aws/src/routes/web.php.

Чи потрібна тут взагалі якесь пояснення? Очевидним наступним кроком є створення зв’язаного файлу контролера.

Контролер

Давайте створимо файл контролера packages/envato/aws/src/Controllers/AwsController.рһрсо наступним вмістом.

disk(‘s3’);
// load local storage
$localStorage = $storage->disk(‘local’);
// default path of local storage “storage/app”
$sourceFileContents = $localStorage->get(‘test.jpg’);
// destination filepath in S3 cloud
$destFilePath = ‘test_new.jpg’;
// init vars
$imageUrl = “;
$errorMsg = “;
// upload file to AWS S3
if ($awsS3Storage->put($destFilePath, $sourceFileContents, ‘public’))
{
$imageUrl = env(‘AWS_CDN_URL’) . env(‘AWS_BUCKET’) . ‘/’ . $destFilePath;
}
else
{
$errorMsg = ‘Oops! Something went wrong Управління пакетами в Laravel ‘;
}
// call view
return view(‘aws::upload’, [‘imageUrl’ => $imageUrl, ‘errorMsg’ => $errorMsg]);
}
}

Давайте розглянемо файл, щоб зрозуміти, для чого призначений кожен фрагмент коду. Ми запускаємо речі, встановлюючи простір імен нашого контролера в простір імен Envato\Aws\Controllers. Нагадаємо, що ми додали відображення Envato\Awsв packages/envato/aws/ѕгсв кореневої composer.json файл, щоб він міг знайти наші файли пакета.

Потім визначаємо upload метод, який вимагає синхронізації локальних файлів з хмарою Amazon S3. Важливо відзначити тут перший аргумент методу завантаження, який запитує \Illuminate\Contracts\Filesystem\Factory залежність. Під час виконання буде укладений відповідний контракт з Laravel.

Тепер ми можемо використовувати примірник factory файлової системи для створення примірників диска по мірі необхідності. Примірник диска в Laravel-це драйвер, який дозволяє вам легко звертатися до базових файловим системам, таким як локальний диск, хмара Amazon S3 тощо.

// load storage s3
$awsS3Storage = $storage->disk(‘s3’);
// load local storage
$localStorage = $storage->disk(‘local’);

Для спрощення ми передамо статичний файл зображення, який вже доступний в локальному сховищі Laravel за замовчуванням, і шлях storage/app/test.jpg. Давайте візьмемо вміст вихідного файлу в якості першого кроку.

// default path of local storage “storage/app”
$sourceFileContents = $localStorage->get(‘test.jpg’);

Ви повинні мати можливість синхронізувати файл з Amazon S3 з допомогою методу put.

// upload file to AWS S3
if ($awsS3Storage->put($destFilePath, $sourceFileContents, ‘public’))
{
$imageUrl = env(‘AWS_CDN_URL’) . env(‘AWS_BUCKET’) . ‘/’ . $destFilePath;
}
else
{
$errorMsg = ‘Oops! Something went wrong Управління пакетами в Laravel ‘;
}

Переконайтеся, що ви правильно налаштували змінні середовища AWS, в тому випадку, якщо щось не працює належним чином. І останнє — викликати файл подання, в якому відображається синхронізоване зображення і відповідне повідомлення.

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

Звичайно, ми ще не створили файл подання, і саме про нього піде мова в наступному розділі.

Подання

Давайте створимо файл виду packages/envato/aws/src/views/upload.blade.php з наступним вмістом.

Laravel
html, body {
background-color: #fff;
color: #636b6f;
font-family: ‘Raleway’, sans-serif;
font-weight: 100;
height: 100vh;
margin: 0;
}
.full-height {
height: 100vh;
}
.flex-center {
align-items: center;
display: flex;
justify-content: center;
}
.position-ref {
position: relative;
}
.top-right {
position: absolute;
right: 10px;
top: 18px;
}
.content {
text-align: center;
}
.title {
font-size: 84px;
}
.links > a {
color: #636b6f;
padding: 0 25px;
font-size: 12px;
font-weight: 600;
letter-spacing: .1rem;
text-decoration: none;
text-transform: uppercase;
}
.m-b-md {
margin-bottom: 30px;
}

@if (Route::has(‘login’))

@if (Auth::check())
Home
@else
Login
Register
@endif

@endif

File upload to S3 Cloud
@if ($imageUrl)
Управління пакетами в Laravel
@else
{{ $errorMsg }}
@endif

Це досить стандартний файл подання, який відображає зображення завантажене при успішного завантаження або відповідне повідомлення про помилку.

Постачальник послуг

Ми майже закінчили з нашим пакетом, так як ми створили необхідні файли. Наступним кроком буде створення постачальника послуг, щоб ми могли реєструвати маршрути та представлення нашого пакету.

Давайте створимо файл постачальника послуг packages/envato/aws/src/Providers/AwsServiceProvider.php з наступним вмістом.

loadRoutesFrom(__DIR__.’/../routes/web.php’);
// load view files
$this->loadViewsFrom(__DIR__.’/../views’, ‘aws’);
// publish files
$this->publishes([
__DIR__.’/../views’ => resource_path(‘views/виробника/aws’),
]);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
}
}

Очевидно, що ви могли б створити файл постачальника послуг, використовуючи команду artisan. Але це вимагало б додаткового кроку переміщення файлу app/Providers в наш пакет.

У будь-якому випадку, давайте розглянемо створений файл постачальника послуг. По-перше, ми завантажуємо маршрути і уявлення, пов’язані з нашим пакетом.

// load routes
$this->loadRoutesFrom(__DIR__.’/../routes/web.php’);
// load view files
$this->loadViewsFrom(__DIR__.’/../views’, ‘aws’);

Потім ми пропонуємо підтримку публікації уявлень наших пакетів, щоб розробники, які хочуть змінити подання, могли це зробити. Наступного разу, коли вони запустили команду php artisan vendor:publish, Laravel скопіював подання з packages/envato/aws/src/views/resources/views/виробника/aws.

Тепер вони можуть змінювати уявлення під resources/views/виробника/aws каталогом, і він буде автоматично вибрано Laravel замість уявлень packages/envato/aws/src/views/. Фактично, це більш правильний спосіб зміни сторонніх уявлень пакетів, ніж пряме зміна пакетів. Що стосується постачальника послуг, нам потрібно додати config/app.php. Додайте в providers масив наступний запис.



/*
* 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, // Our package service provider

Все готово. Тепер ми можемо перевірити наш пакет.

Запустіть URL – адресу http: // your-laravel-application / aws / s3 / upload у своєму браузері. Якщо все зроблено правильно, ви повинні побачити зображення завантажене з хмари Amazon S3, на своїй сторінці. Будь ласка, дайте мені знати, якщо у вас виникнуть якісь проблеми, я буду більш ніж щасливий розібратися з ними.

Отже, ми знаходимося в заключній частині цієї статті, і я сподіваюся, вам сподобалося!

Висновок

Сьогодні ми обговорили одну з важливих особливостей управління базою даних Laravel. У процесі створення нашого індивідуального пакета Laravel ми розглянули приклад реального світу, який продемонстрував, як ви можете завантажити зображення в хмару Amazon S3.

Це дійсно корисна функція, якщо ви хочете об’єднати і розподілити набір функцій разом. Фактично, ви можете подивитися на це як на підхід до розробки користувальницьких модулів в Laravel.