Документация Laravel 10.x
Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.
Laravel предоставляет мощную абстракцию файловой системы благодаря замечательному пакету PHP Flysystem Франка де Йонга. Интеграция Laravel Flysystem предоставляет простые драйверы для работы с локальными файловыми системами, SFTP и Amazon S3. И, что еще лучше, невероятно легко переключаться между этими вариантами хранения между вашим локальным рабочим столом и сервером продакшена, поскольку API остается одинаковым для каждой системы.
Конфигурационный файл файловой системы Laravel находится по пути config/filesystems.php
. В этом файле вы можете настроить все свои файловые "диски". Каждый диск представляет собой определенный драйвер хранения и местоположение хранения. Примеры конфигураций для каждого поддерживаемого драйвера включены в файл конфигурации, чтобы вы могли изменить конфигурацию в соответствии с вашими предпочтениями и учетными данными хранения.
Драйвер local
взаимодействует с файлами, хранящимися локально на сервере, на котором работает приложение Laravel, в то время как драйвер s3
используется для записи в облачное хранилище Amazon S3.
Примечание Вы можете настроить столько дисков, сколько вам нужно, и даже иметь несколько дисков, использующих один и тот же драйвер.
При использовании драйвера local
все операции с файлами относятся к каталогу root
, определенному в вашем файле конфигурации filesystems
. По умолчанию это значение установлено в каталог storage/app
. Таким образом, следующий метод записи будет производиться в storage/app/example.txt
:
use Illuminate\Support\Facades\Storage; Storage::disk('local')->put('example.txt', 'Contents');
Диск public
, включенный в файл конфигурации filesystems
вашего приложения, предназначен для файлов, которые будут общедоступными. По умолчанию диск public
использует драйвер local
и хранит файлы в storage/app/public
.
Чтобы сделать эти файлы доступными из Интернета, вы должны создать символическую ссылку от public/storage
к storage/app/public
. Использование этой конвенции папок сохранит ваши общедоступные файлы в одном каталоге, который легко обмениваться между развертываниями, при использовании систем развертывания с нулевым временем простоя, такими как Envoyer.
Чтобы создать символическую ссылку, вы можете использовать команду Artisan storage:link
:
php artisan storage:link
После сохранения файла и создания символической ссылки вы можете создать URL для файлов с помощью вспомогательной функции asset
:
echo asset('storage/file.txt');
Вы можете настроить дополнительные символические ссылки в вашем файле конфигурации filesystems
. Каждая из настроенных ссылок будет создана при выполнении команды storage:link
:
'links' => [ public_path('storage') => storage_path('app/public'), public_path('images') => storage_path('app/images'),],
Прежде чем использовать драйвер S3, вам нужно установить пакет Flysystem S3 с помощью менеджера пакетов Composer:
composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies
Информация о конфигурации драйвера S3 находится в вашем файле конфигурации config/filesystems.php
. Этот файл содержит массив конфигурации примера для драйвера S3. Вы можете свободно изменять этот массив своей собственной конфигурацией и учетными данными S3. Для удобства эти переменные окружения соответствуют соглашению об именах, используемому AWS CLI.
Прежде чем использовать драйвер FTP, вам нужно установить пакет Flysystem FTP с помощью менеджера пакетов Composer:
composer require league/flysystem-ftp "^3.0"
Интеграция Laravel с Flysystem прекрасно работает с FTP; однако образец конфигурации не включен в файл конфигурации filesystems.php
по умолчанию. Если вам нужно настроить файловую систему FTP, вы можете использовать приведенный ниже пример конфигурации:
'ftp' => [ 'driver' => 'ftp', 'host' => env('FTP_HOST'), 'username' => env('FTP_USERNAME'), 'password' => env('FTP_PASSWORD'), // Дополнительные настройки FTP... // 'port' => env('FTP_PORT', 21), // 'root' => env('FTP_ROOT'), // 'passive' => true, // 'ssl' => true, // 'timeout' => 30,],
Перед использованием драйвера SFTP вам нужно установить пакет Flysystem SFTP с помощью менеджера пакетов Composer:
composer require league/flysystem-sftp-v3 "^3.0"
Интеграция Flysystem в Laravel прекрасно работает с SFTP; однако образец конфигурации не включен в конфигурационный файл filesystems.php
по умолчанию. Если вам нужно настроить файловую систему SFTP, вы можете использовать приведенный ниже пример конфигурации:
'sftp' => [ 'driver' => 'sftp', 'host' => env('SFTP_HOST'), // Настройки для базовой аутентификации... 'username' => env('SFTP_USERNAME'), 'password' => env('SFTP_PASSWORD'), // Настройки для аутентификации на основе SSH-ключа с паролем шифрования... 'privateKey' => env('SFTP_PRIVATE_KEY'), 'passphrase' => env('SFTP_PASSPHRASE'), // Настройки для прав файлов / директорий... 'visibility' => 'private', // `private` = 0600, `public` = 0644 'directory_visibility' => 'private', // `private` = 0700, `public` = 0755 // Дополнительные настройки SFTP... // 'hostFingerprint' => env('SFTP_HOST_FINGERPRINT'), // 'maxTries' => 4, // 'passphrase' => env('SFTP_PASSPHRASE'), // 'port' => env('SFTP_PORT', 22), // 'root' => env('SFTP_ROOT', ''), // 'timeout' => 30, // 'useAgent' => true,],
Облачные диски позволяют вам определить файловую систему, где все пути автоматически предваряются заданным префиксом пути. Прежде чем создавать облачный файловый диск, вам нужно установить дополнительный пакет Flysystem с помощью менеджера пакетов Composer:
composer require league/flysystem-path-prefixing "^3.0"
Вы можете создать экземпляр файловой системы с ограниченной областью видимости любого существующего диска, определив диск, который использует драйвер scoped
. Например, вы можете создать диск, который ограничивает ваш существующий диск s3
определенным префиксом пути, и затем каждая операция с файлами с использованием вашего облачного диска будет использовать указанный префикс:
's3-videos' => [ 'driver' => 'scoped', 'disk' => 's3', 'prefix' => 'path/to/videos',],
"Диски только для чтения" позволяют вам создавать файловые диски, которые не позволяют выполнять операции записи. Прежде чем использовать опцию конфигурации read-only
, вам нужно установить дополнительный пакет Flysystem с помощью менеджера пакетов Composer:
composer require league/flysystem-read-only "^3.0"
Затем вы можете включить опцию конфигурации read-only
в одном или нескольких массивах конфигурации вашего диска:
's3-videos' => [ 'driver' => 's3', // ... 'read-only' => true,],
По умолчанию файловая система вашего приложения содержит конфигурацию диска для диска s3
. Кроме использования этого диска для взаимодействия с Amazon S3, вы можете использовать его для взаимодействия с любым совместимым с S3 службой хранения файлов, такой как MinIO или DigitalOcean Spaces.
Обычно, после обновления учетных данных диска, чтобы соответствовать учетным данным службы, которую вы собираетесь использовать, вам нужно только обновить значение конфигурационной опции endpoint
. Значение этой опции обычно определяется с использованием переменной среды AWS_ENDPOINT
:
'endpoint' => env('AWS_ENDPOINT', 'https://minio:9000'),
Для того чтобы интеграция Flysystem Laravel генерировала правильные URL-адреса при использовании MinIO, вы должны определить переменную среды AWS_URL
, чтобы она соответствовала локальному URL вашего приложения и включала имя бакета в путь URL:
AWS_URL=http://localhost:9000/local
Внимание Генерация временных URL-адресов хранилища с использованием метода
temporaryUrl
не поддерживается при использовании MinIO.
Фасад Storage
можно использовать для взаимодействия с любым из настроенных вами дисков. Например, вы можете использовать метод put
на фасаде, чтобы сохранить аватар на диске по умолчанию. Если вы вызываете методы на фасаде Storage
без предварительного вызова метода disk
, метод будет автоматически передан на диск по умолчанию:
use Illuminate\Support\Facades\Storage; Storage::put('avatars/1', $content);
Если ваше приложение взаимодействует с несколькими дисками, вы можете использовать метод disk
на фасаде Storage
для работы с файлами на определенном диске:
Storage::disk('s3')->put('avatars/1', $content);
Иногда вам может потребоваться создать диск во время выполнения с заданной конфигурацией, без того чтобы эта конфигурация фактически присутствовала в файле конфигурации filesystems
вашего приложения. Для этого вы можете передать массив конфигурации методу build
фасада Storage
:
use Illuminate\Support\Facades\Storage; $disk = Storage::build([ 'driver' => 'local', 'root' => '/path/to/root',]); $disk->put('image.jpg', $content);
Метод get
можно использовать для извлечения содержимого файла. Метод вернет сырые строковые содержимое файла. Помните, что все пути файлов должны быть указаны относительно "корневого" расположения диска:
$contents = Storage::get('file.jpg');
Если файл, который вы извлекаете, содержит JSON, вы можете использовать метод json
для извлечения файла и декодирования его содержимого:
$orders = Storage::json('orders.json');
Метод exists
можно использовать для определения того, существует ли файл на диске:
if (Storage::disk('s3')->exists('file.jpg')) { // ...}
Метод missing
можно использовать для определения того, отсутствует ли файл на диске:
if (Storage::disk('s3')->missing('file.jpg')) { // ...}
Метод download
можно использовать для создания ответа, который заставляет браузер пользователя загрузить файл по указанному пути. Метод download
принимает имя файла вторым аргументом метода, которое определит имя файла, видимое пользователем, загружающим файл. Наконец, вы можете передать массив HTTP-заголовков в качестве третьего аргумента метода:
return Storage::download('file.jpg'); return Storage::download('file.jpg', $name, $headers);
Метод url
можно использовать для получения URL-адреса для заданного файла. Если вы используете драйвер local
, это обычно просто добавит /storage
к заданному пути и вернет относительный URL-адрес файла. Если вы используете драйвер s3
, будет возвращен полностью квалифицированный удаленный URL-адрес:
use Illuminate\Support\Facades\Storage; $url = Storage::url('file.jpg');
При использовании драйвера local
все файлы, которые должны быть общедоступными, следует помещать в каталог storage/app/public
. Кроме того, вы должны создать символическую ссылку на public/storage
, которая указывает на каталог storage/app/public
.
Внимание При использовании драйвера
local
возвращаемое значениеurl
не кодируется в URL. По этой причине мы рекомендуем всегда сохранять ваши файлы с использованием имен, которые создадут допустимые URL.
Если вы хотите предварительно задать хост для URL, создаваемых с использованием фасада Storage
, вы можете добавить опцию url
в массив конфигурации диска:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public',],
С использованием метода temporaryUrl
вы можете создавать временные URL-адреса для файлов, хранящихся с использованием драйвера s3
. Этот метод принимает путь и экземпляр DateTime
, указывающий, когда URL-адрес должен истечь:
use Illuminate\Support\Facades\Storage; $url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5));
Если вам нужно указать дополнительные параметры запроса S3, вы можете передать массив параметров запроса в качестве третьего аргумента методу temporaryUrl
:
$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5), [ 'ResponseContentType' => 'application/octet-stream', 'ResponseContentDisposition' => 'attachment; filename=file2.jpg', ]);
Если вам нужно настроить способ создания временных URL-адресов для конкретного диска хранения, вы можете использовать метод buildTemporaryUrlsUsing
. Например, это может быть полезно, если у вас есть контроллер, который позволяет загружать файлы, хранящиеся с использованием диска, который обычно не поддерживает временные URL-адреса. Обычно этот метод следует вызывать из метода boot
провайдера службы:
<?php namespace App\Providers; use DateTime;use Illuminate\Support\Facades\Storage;use Illuminate\Support\Facades\URL;use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider{ /** * Загрузить любые службы приложения. */ public function boot(): void { Storage::disk('local')->buildTemporaryUrlsUsing( function (string $path, DateTime $expiration, array $options) { return URL::temporarySignedRoute( 'files.download', $expiration, array_merge($options, ['path' => $path]) ); } ); }}
Внимание Возможность генерации временных URL-адресов для загрузки поддерживается только драйвером
s3
.
Если вам нужно создать временный URL-адрес, который можно использовать для загрузки файла напрямую из вашего клиентского приложения, вы можете использовать метод temporaryUploadUrl
. Этот метод принимает путь и экземпляр DateTime
, указывающий, когда URL-адрес должен истечь. Метод temporaryUploadUrl
возвращает ассоциативный массив, который может быть разрушен в URL-адрес загрузки и заголовки, которые следует включить в запрос на загрузку:
use Illuminate\Support\Facades\Storage; ['url' => $url, 'headers' => $headers] = Storage::temporaryUploadUrl( 'file.jpg', now()->addMinutes(5));
Этот метод в первую очередь полезен в серверных средах, которые требуют от клиентского приложения напрямую загружать файлы в систему облачного хранения, такую как Amazon S3.
Помимо чтения и записи файлов, Laravel также может предоставлять информацию о самих файлах. Например, метод size
можно использовать для получения размера файла в байтах:
use Illuminate\Support\Facades\Storage; $size = Storage::size('file.jpg');
Метод lastModified
возвращает временную метку UNIX последнего времени изменения файла:
$time = Storage::lastModified('file.jpg');
MIME-тип заданного файла можно получить с использованием метода mimeType
:
$mime = Storage::mimeType('file.jpg');
Метод path
можно использовать для получения пути к заданному файлу. Если вы используете драйвер local
, это вернет абсолютный путь к файлу. Если вы используете драйвер s3
, этот метод вернет относительный путь к файлу в бакете S3:
use Illuminate\Support\Facades\Storage; $path = Storage::path('file.jpg');
Метод put
можно использовать для сохранения содержимого файла на диске. Вы также можете передать ресурс PHP в метод put
, который будет использовать базовую поддержку потока Flysystem. Помните, что все пути к файлам должны быть указаны относительно "корневого" расположения, настроенного для диска:
use Illuminate\Support\Facades\Storage; Storage::put('file.jpg', $contents); Storage::put('file.jpg', $resource);
Если метод put
(или другие операции "записи") не может записать файл на диск, будет возвращено значение false
:
if (! Storage::put('file.jpg', $contents)) { // Файл не может быть записан на диск...}
По желанию вы можете определить опцию throw
в массиве конфигурации диска файловой системы. Когда эта опция определена как true
, методы "записи", такие как put
, будут бросать исключение League\Flysystem\UnableToWriteFile
, если операции записи завершатся неудачно:
'public' => [ 'driver' => 'local', // ... 'throw' => true,],
Методы prepend
и append
позволяют вам записывать в начало или конец файла:
Storage::prepend('file.log', 'Prepended Text'); Storage::append('file.log', 'Appended Text');
Метод copy
можно использовать для копирования существующего файла в новое расположение на диске, в то время как метод move
можно использовать для переименования или перемещения существующего файла в новое расположение:
Storage::copy('old/file.jpg', 'new/file.jpg'); Storage::move('old/file.jpg', 'new/file.jpg');
Передача файлов в хранилище предлагает значительно сниженное использование памяти. Если вы хотите, чтобы Laravel автоматически управлял передачей заданного файла в ваше место хранения, вы можете использовать метод putFile
или putFileAs
. Этот метод принимает экземпляр Illuminate\Http\File
или Illuminate\Http\UploadedFile
и автоматически передает файл в желаемое место:
use Illuminate\Http\File;use Illuminate\Support\Facades\Storage; // Автоматически генерировать уникальный идентификатор для имени файла...$path = Storage::putFile('photos', new File('/path/to/photo')); // Вручную указать имя файла...$path = Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
Есть несколько важных моментов, которые следует отметить относительно метода putFile
. Обратите внимание, что мы указали только имя каталога, а не имя файла. По умолчанию метод putFile
будет генерировать уникальный идентификатор в качестве имени файла. Расширение файла будет определено путем анализа MIME-типа файла. Путь к файлу будет возвращен методом putFile
, чтобы вы могли сохранить путь, включая сгенерированное имя файла, в вашей базе данных.
Методы putFile
и putFileAs
также принимают аргумент для указания "видимости" сохраненного файла. Это особенно полезно, если вы сохраняете файл на облачном диске, таком как Amazon S3, и хотите, чтобы файл был общедоступен с использованием созданных URL:
Storage::putFile('photos', new File('/path/to/photo'), 'public');
В веб-приложениях одним из самых распространенных случаев использования для хранения файлов является хранение загруженных пользователем файлов, таких как фотографии и документы. Laravel упрощает хранение загруженных файлов с использованием метода store
на экземпляре загруженного файла. Вызовите метод store
с путем, по которому вы хотите сохранить загруженный файл:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller;use Illuminate\Http\Request; class UserAvatarController extends Controller{ /** * Обновить аватар пользователя. */ public function update(Request $request): string { $path = $request->file('avatar')->store('avatars'); return $path; }}
Есть несколько важных моментов, которые следует отметить относительно этого примера. Обратите внимание, что мы указали только имя каталога, а не имя файла. По умолчанию метод store
будет генерировать уникальный идентификатор в качестве имени файла. Расширение файла будет определено путем анализа MIME-типа файла. Путь к файлу будет возвращен методом store
, чтобы вы могли сохранить путь, включая сгенерированное имя файла, в вашей базе данных.
Вы также можете вызвать метод putFile
на фасаде Storage
, чтобы выполнить ту же операцию сохранения файла, что и в приведенном выше примере:
$path = Storage::putFile('avatars', $request->file('avatar'));
Если вы не хотите, чтобы имя файла автоматически присваивалось вашему сохраненному файлу, вы можете использовать метод storeAs
, который принимает в качестве аргументов путь, имя файла и (необязательно) диск:
$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id);
Вы также можете использовать метод putFileAs
на фасаде Storage
, который выполнит ту же операцию сохранения файла, что и в приведенном выше примере:
$path = Storage::putFileAs( 'avatars', $request->file('avatar'), $request->user()->id);
Внимание Из названий файлов автоматически удаляются непечатаемые и недопустимые символы Unicode. Поэтому вы можете захотеть очищать ваши пути файлов перед передачей их методам хранения файлов Laravel. Пути файлов нормализуются с использованием метода
League\Flysystem\WhitespacePathNormalizer::normalizePath
.
По умолчанию метод store
этого загруженного файла будет использовать ваш диск по умолчанию. Если вы хотите указать другой диск, передайте имя диска вторым аргументом методу store
:
$path = $request->file('avatar')->store( 'avatars/'.$request->user()->id, 's3');
Если вы используете метод storeAs
, вы можете передать имя диска в качестве третьего аргумента методу:
$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id, 's3');
Если вы хотите получить исходное имя и расширение загруженного файла, вы можете сделать это, используя методы getClientOriginalName
и getClientOriginalExtension
:
$file = $request->file('avatar'); $name = $file->getClientOriginalName();$extension = $file->getClientOriginalExtension();
Однако имейте в виду, что методы getClientOriginalName
и getClientOriginalExtension
считаются небезопасными, так как имя файла и его расширение могут быть изменены зловредным пользователем. По этой причине обычно рекомендуется использовать методы hashName
и extension
для получения имени и расширения для данной загрузки файла:
$file = $request->file('avatar'); $name = $file->hashName(); // Generate a unique, random name...$extension = $file->extension(); // Determine the file's extension based on the file's MIME type...
В интеграции Laravel с Flysystem "видимость" представляет собой абстракцию прав доступа к файлам на нескольких платформах. Файлы могут быть объявлены как public
или private
. Когда файл объявляется public
, вы указываете, что файл в целом должен быть доступен другим. Например, при использовании драйвера S3 вы можете получать URL-адреса для public
файлов.
Вы можете установить видимость при записи файла с помощью метода put
:
use Illuminate\Support\Facades\Storage; Storage::put('file.jpg', $contents, 'public');
Если файл уже был сохранен, его видимость можно получить и установить с помощью методов getVisibility
и setVisibility
:
$visibility = Storage::getVisibility('file.jpg'); Storage::setVisibility('file.jpg', 'public');
При взаимодействии с загруженными файлами вы можете использовать методы storePublicly
и storePubliclyAs
для сохранения загруженного файла с видимостью public
:
$path = $request->file('avatar')->storePublicly('avatars', 's3'); $path = $request->file('avatar')->storePubliclyAs( 'avatars', $request->user()->id, 's3');
При использовании драйвера local
public
видимость преобразуется в разрешения 0755
для каталогов и 0644
для файлов. Вы можете изменить соответствие разрешений в файле конфигурации filesystems
вашего приложения:
'local' => [ 'driver' => 'local', 'root' => storage_path('app'), 'permissions' => [ 'file' => [ 'public' => 0644, 'private' => 0600, ], 'dir' => [ 'public' => 0755, 'private' => 0700, ], ],],
Метод delete
принимает одно имя файла или массив файлов для удаления:
use Illuminate\Support\Facades\Storage; Storage::delete('file.jpg'); Storage::delete(['file.jpg', 'file2.jpg']);
При необходимости вы можете указать диск, с которого следует удалить файл:
use Illuminate\Support\Facades\Storage; Storage::disk('s3')->delete('path/file.jpg');
Метод files
возвращает массив всех файлов в заданном каталоге. Если вы хотите получить список всех файлов в заданном каталоге, включая все подкаталоги, вы можете использовать метод allFiles
:
use Illuminate\Support\Facades\Storage; $files = Storage::files($directory); $files = Storage::allFiles($directory);
Метод directories
возвращает массив всех каталогов в заданном каталоге. Кроме того, вы можете использовать метод allDirectories
, чтобы получить список всех каталогов в заданном каталоге и всех его подкаталогах:
$directories = Storage::directories($directory); $directories = Storage::allDirectories($directory);
Метод makeDirectory
создаст заданный каталог, включая все необходимые подкаталоги:
Storage::makeDirectory($directory);
Наконец, метод deleteDirectory
можно использовать для удаления каталога и всех его файлов:
Storage::deleteDirectory($directory);
Метод fake
фасада Storage
позволяет легко создавать фиктивный диск, который, в сочетании с средствами генерации файлов класса Illuminate\Http\UploadedFile
, существенно упрощает тестирование загрузки файлов. Например:
<?php namespace Tests\Feature; use Illuminate\Http\UploadedFile;use Illuminate\Support\Facades\Storage;use Tests\TestCase; class ExampleTest extends TestCase{ public function test_albums_can_be_uploaded(): void { Storage::fake('photos'); $response = $this->json('POST', '/photos', [ UploadedFile::fake()->image('photo1.jpg'), UploadedFile::fake()->image('photo2.jpg') ]); // Утвердить, что один или несколько файлов были сохранены... Storage::disk('photos')->assertExists('photo1.jpg'); Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']); // Утвердить, что один или несколько файлов не были сохранены... Storage::disk('photos')->assertMissing('missing.jpg'); Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']); // Утвердить, что указанная директория пуста... Storage::disk('photos')->assertDirectoryEmpty('/wallpapers'); }}
По умолчанию метод fake
будет удалять все файлы в своем временном каталоге. Если вы хотите сохранить эти файлы, вы можете использовать метод "persistentFake" вместо этого. Для получения дополнительной информации по тестированию загрузки файлов вы можете обратиться к документации по тестированию HTTP, касающейся загрузки файлов.
Внимание Метод
image
требует расширения GD.
Интеграция Laravel с Flysystem предоставляет поддержку нескольких "драйверов" из коробки. Тем не менее Flysystem не ограничивается этими и имеет адаптеры для многих других систем хранения. Вы можете создать собственный драйвер, если хотите использовать один из этих дополнительных адаптеров в своем приложении Laravel.
Чтобы определить собственную файловую систему, вам потребуется адаптер Flysystem. Давайте добавим адаптер Dropbox, поддерживаемый сообществом, в наш проект:
composer require spatie/flysystem-dropbox
Затем вы можете зарегистрировать драйвер в методе boot
одного из сервис-провайдеров вашего приложения. Для этого вы должны использовать метод extend
фасада Storage
:
<?php namespace App\Providers; use Illuminate\Contracts\Foundation\Application;use Illuminate\Filesystem\FilesystemAdapter;use Illuminate\Support\Facades\Storage;use Illuminate\Support\ServiceProvider;use League\Flysystem\Filesystem;use Spatie\Dropbox\Client as DropboxClient;use Spatie\FlysystemDropbox\DropboxAdapter; class AppServiceProvider extends ServiceProvider{ /** * Зарегистрировать любые службы приложения. */ public function register(): void { // ... } /** * Загрузить любые службы приложения. */ public function boot(): void { Storage::extend('dropbox', function (Application $app, array $config) { $adapter = new DropboxAdapter(new DropboxClient( $config['authorization_token'] )); return new FilesystemAdapter( new Filesystem($adapter, $config), $adapter, $config ); }); }}
Первый аргумент метода extend
- это имя драйвера, а второй - замыкание, которое принимает переменные $app
и $config
. Замыкание должно возвращать экземпляр Illuminate\Filesystem\FilesystemAdapter
. Переменная $config
содержит значения, определенные в config/filesystems.php
для указанного диска.
После того как вы создали и зарегистрировали провайдер сервиса расширения, вы можете использовать драйвер dropbox
в вашем файле конфигурации config/filesystems.php
.