От автора: в этой статье мы рассмотрим , как управляются в Laravel пакеты. В ходе статьи мы рассмотрим реальный пример, чтобы продемонстрировать цель статьи. Управление пакетами в Laravel — важная функция, которая позволяет объединить и распределить функциональность. Кроме того, можно опубликовать свой пакет в хранилищах вроде Packagist и GitHub, это позволит другим разработчикам извлечь пользу из вашего пакета.
Чтобы продемонстрировать концепцию, для примера мы создадим страницу в Laravel, которая загружает изображение в облако Amazon S3. Вместо того чтобы идти с обычным потоком, мы разработаем его как пакет, который можно легко распределять и поддерживать.
Прежде чем двигаться дальше, я расчитываю, что вы уже знакомы с базой Laravel, поскольку я не буду вдаваться в подробности основных концепций Laravel.
Кроме того, вам необходимо иметь действительную учетную запись AWS и учетные данные для доступа к API Amazon, чтобы следовать вместе с примером в этой статье. Итак, убедитесь, что всё это у вас есть. Теперь мы готовы погрузиться в изучение.
Настройка файлов пакетов
Давайте быстро рассмотрим список файлов, которые мы будем внедрять на протяжении всего урока.

Бесплатный курс «Laravel + Angular. Быстрый старт»
Изучите курс и узнайте, как создать веб-приложение с нуля на Angular и Laravel
Получить курсcomposer.json: Нам нужно добавить сопоставление классов нашего пакета в существующий composer.json файл в корневом каталоге.
config/app.php: Это существующий файл, который мы будем использовать для добавления записи нашего пользовательского поставщика услуг, чтобы загружать представления и маршруты с использованием этого файла.
composer.json: Это пакетный composer.jsonфайл, если вы хотите распространять пакет вместе с другими.
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 выполните команду компилятора из корневого каталога проекта.
1 |
$composer require league/flysystem-aws-s3-v3 |
После успешного выполнения этой команды теперь вы можете использовать Laravel Flysystem для взаимодействия с облачной файловой системой Amazon S3 так же, как вы использовали бы ее для локальной файловой системы.
Теперь давайте быстро потянем за config/filesystems.php файл, чтобы увидеть настройки, предоставленные для файловой системы Amazon S3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
... ... '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 файл следующие переменные.
1 2 3 4 5 |
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» в раздел автозагрузки, как показано ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
... ... "autoload": { "classmap": [ "database" ], "psr-4": { "App\\": "app/", "Envato\\Aws\\": "packages/envato/aws/src" } }, ... ... |
Как можно увидеть, пространство имен Envato\Aws\ отображается в packages/envato/aws/srcкаталог. Теперь нам просто нужно запустить команду dump-autoload для восстановления композиционных сопоставлений.
1 |
$composer dump-autoload |
Теперь вы можете использовать пространство имен Envato\Aws\ в своем приложении, и оно подберет файлы из правильного местоположения!
Файл композиции пакета
Теперь давайте добавим специфичный для пакета файл composer.json, чтобы была возможность распространять свой пакет в репозитории packagist. Перейдите в packages/envato/aws каталог и выполните следующую команду для создания composer.json файла.
1 |
$composer init |
Вам будут заданы обычные вопросы, просто пройдите их, и файл composer.json будет создан. Он должен выглядеть примерно так.
1 2 3 4 5 6 |
{ "name": "envato/aws", "description": "Example of File Upload to AWS S3 Cloud", "minimum-stability": "dev", "require": {} } |
Маршрут
В пакете мы создадим простую страницу, отображающую статус загруженного файла. Поэтому нам нужно создать маршрут, связанный с этой страницей. Давайте создадим файл маршрута в packages/envato/aws/src/routes/web.php.

Бесплатный курс «Laravel + Angular. Быстрый старт»
Изучите курс и узнайте, как создать веб-приложение с нуля на Angular и Laravel
Получить курс
1 2 |
<?php Route::get('aws/s3/upload', 'Envato\Aws\Controllers\AwsController@upload'); |
Требуется ли здесь вообще какое-либо объяснение? Очевидным следующим шагом является создание связанного файла контроллера.
Контроллер
Давайте создадим файл контроллера packages/envato/aws/src/Controllers/AwsController.phpсо следующим содержимым.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php namespace Envato\Aws\Controllers; use App\Http\Controllers\Controller; class AwsController extends Controller { public function upload(\Illuminate\Contracts\Filesystem\Factory $storage) { // load s3 storage $awsS3Storage = $storage->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 :('; } // call view return view('aws::upload', ['imageUrl' => $imageUrl, 'errorMsg' => $errorMsg]); } } |
Давайте рассмотрим файл, чтобы понять, для чего предназначен каждый фрагмент кода. Мы запускаем вещи, устанавливая пространство имен нашего контроллера в пространство имен Envato\Aws\Controllers. Напомним, что мы добавили отображение Envato\Awsв packages/envato/aws/srcв корневой composer.json файл, чтобы он мог найти наши файлы пакета.
Затем определяем upload метод, который требует синхронизации локальных файлов с облаком Amazon S3. Важно отметить здесь первый аргумент метода загрузки, который запрашивает \Illuminate\Contracts\Filesystem\Factory зависимость. Во время исполнения будет заключен соответствующий контракт с Laravel.
Теперь мы можем использовать экземпляр factory файловой системы для создания экземпляров диска по мере необходимости. Экземпляр диска в Laravel-это драйвер, который позволяет вам легко обращаться к базовым файловым системам, таким как локальный диск, облако Amazon S3 и тому подобное.
1 2 3 4 5 |
// load s3 storage $awsS3Storage = $storage->disk('s3'); // load local storage $localStorage = $storage->disk('local'); |
Для упрощения мы передадим статический файл изображения, который уже доступен в локальном хранилище Laravel по умолчанию, и путь storage/app/test.jpg. Давайте возьмем содержимое исходного файла в качестве первого шага.
1 2 |
// default path of local storage "storage/app" $sourceFileContents = $localStorage->get('test.jpg'); |
Вы должны иметь возможность синхронизировать файл с Amazon S3 с помощью метода put.
1 2 3 4 5 6 7 8 9 |
// 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 :('; } |
Убедитесь, что вы правильно настроили переменные среды AWS, в том случае, если что-то не работает должным образом. И последнее — вызвать файл представления, в котором отображается синхронизированное изображение и соответствующее сообщение.
1 2 |
// call view return view('aws::upload', ['imageUrl' => $imageUrl, 'errorMsg' => $errorMsg]); |
Конечно, мы еще не создали файл представления, и именно о нём пойдет речь в следующем разделе.
Представление
Давайте создадим файл вида packages/envato/aws/src/views/upload.blade.php со следующим содержимым.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
<!DOCTYPE html> <html lang="{{ config('app.locale') }}"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <!-- Fonts --> <link href="//fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css"> <!-- Styles --> <style> 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; } </style> </head> <body> <div class="flex-center position-ref full-height"> @if (Route::has('login')) <div class="top-right links"> @if (Auth::check()) <a href="{{ url('/home') }}">Home</a> @else <a href="{{ url('/login') }}">Login</a> <a href="{{ url('/register') }}">Register</a> @endif </div> @endif <div class="content"> <div class="title m-b-md"> File upload to S3 Cloud </div> <div> @if ($imageUrl) <img src="{{ $imageUrl }}" width="100"/> @else <span class="error">{{ $errorMsg }}</span> @endif </div> </div> </div> </body> </html> |
Это довольно стандартный файл представления, который отображает загруженное изображение при успешной загрузке или соответствующее сообщение об ошибке.
Поставщик услуг
Мы почти закончили с нашим пакетом, так как мы создали необходимые файлы. Следующим шагом будет создание поставщика услуг, чтобы мы могли регистрировать маршруты и представления нашего пакета.
Давайте создадим файл поставщика услуг packages/envato/aws/src/Providers/AwsServiceProvider.php со следующим содержимым.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php namespace Envato\Aws\Providers; use Illuminate\Support\ServiceProvider; class AwsServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { // load routes $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); // load view files $this->loadViewsFrom(__DIR__.'/../views', 'aws'); // publish files $this->publishes([ __DIR__.'/../views' => resource_path('views/vendor/aws'), ]); } /** * Register the application services. * * @return void */ public function register() { } } |
Очевидно, что вы могли бы создать файл поставщика услуг, используя команду artisan. Но это потребовало бы дополнительного шага перемещения файла из app/Providers в наш пакет.
В любом случае, давайте рассмотрим созданный файл поставщика услуг. Во-первых, мы загружаем маршруты и представления, связанные с нашим пакетом.
1 2 3 4 5 |
// 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/vendor/aws.
Теперь они могут изменять представления под resources/views/vendor/aws каталогом, и он будет автоматически выбран Laravel вместо представлений packages/envato/aws/src/views/. Фактически, это более правильный способ изменения сторонних представлений пакетов, нежели прямое изменение пакетов. Что касается поставщика услуг, нам нужно добавить config/app.php. Добавьте в providers массив следующую запись.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
... ... /* * 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.
Автор: Sajal Soni
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.

Бесплатный курс «Laravel + Angular. Быстрый старт»
Изучите курс и узнайте, как создать веб-приложение с нуля на Angular и Laravel
Получить курс
Хотите узнать, что необходимо для создания сайта?
Посмотрите видео и узнайте пошаговый план по созданию сайта с нуля!
Смотреть