Идёт обновление сайта. Несколько дней возможны сбои в оформлении и переводах. Документация работает — если страница выглядит сломанной, обновите её позже.

Документация
L Laravel L intervention/image
Войти
Главная Laravel 10.x Хранение файлов

Хранение файлов

10.x 7 мар 2026 г.

#Введение

Laravel предоставляет мощную абстракцию файловой системы благодаря отличному PHP-пакету Flysystem от Frank de Jonge. Интеграция 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'),
],

Команду storage:unlink можно использовать для удаления настроенных символических ссылок:

php artisan storage:unlink

#Требования к драйверам

#Настройка драйвера S3

Перед использованием драйвера 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

Перед использованием драйвера 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

Перед использованием драйвера SFTP необходимо установить пакет Flysystem SFTP через менеджер пакетов Composer:

composer require league/flysystem-sftp-v3 "^3.0"

Интеграция Laravel с Flysystem отлично работает с 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,
],

#Файловые системы, совместимые с Amazon S3

По умолчанию в конфигурационном файле filesystems вашего приложения содержится настройка диска s3. Помимо взаимодействия с Amazon S3, вы можете использовать этот диск для работы с любым файловым хранилищем, совместимым с S3, например, MinIO или DigitalOcean Spaces.

Обычно после обновления учётных данных диска на соответствующие сервису достаточно изменить значение опции endpoint. Обычно это значение задаётся через переменную окружения AWS_ENDPOINT:

'endpoint' => env('AWS_ENDPOINT', 'https://minio:9000'),

#MinIO

Чтобы интеграция Laravel с Flysystem корректно генерировала 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 возвращает 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

Если вы хотите заранее задать хост для URL, генерируемых фасадом Storage, можно добавить опцию url в конфигурацию диска:

'public' => [
    'driver' => 'local',
    'root' => storage_path('app/public'),
    'url' => env('APP_URL').'/storage',
    'visibility' => 'public',
],

#Временные URL

Метод 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 для загрузки

Внимание

Возможность генерации временных 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 можно использовать для сохранения содержимого файла на диске. Также в метод put можно передать PHP resource — при этом будет задействована встроенная поддержка потоков Flysystem. Помните, что все пути к файлам должны указываться относительно корневого ("root") каталога, настроенного для диска:

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 и putFileAs мы указали только имя директории, а не имя файла. По умолчанию putFile генерирует уникальный идентификатор для имени файла. Расширение файла определяется по MIME-типу. Метод возвращает путь к файлу, включая сгенерированное имя, чтобы вы могли сохранить его в базе данных.

Методы 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(); // Сгенерировать уникальное случайное имя...
$extension = $file->extension(); // Определить расширение по MIME-типу...

#Видимость файлов

В интеграции 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.