← Назад к вопросам

Какие знаешь типы хранилищ в Laravel?

1.7 Middle🔥 51 комментариев
#Фреймворки

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы хранилищ (Storage) в Laravel

Laravel предоставляет мощную и унифицированную абстракцию для работы с файловыми системами через компонент Filesystem, основанный на библиотеке Flysystem. Эта система позволяет работать с разнообразными хранилищами, используя единый API, что упрощает переключение между ними и повышает тестируемость кода.

Основные типы хранилищ (диски)

1. Локальное хранилище (local)

Стандартный диск для работы с файловой системой сервера. Файлы хранятся в директории storage/app (по умолчанию), но путь можно настроить.

// Конфигурация в config/filesystems.php
'local' => [
    'driver' => 'local',
    'root' => storage_path('app'),
    'throw' => false,
],

// Использование
Storage::disk('local')->put('file.txt', 'Содержимое');

2. Публичное хранилище (public)

Аналогично локальному, но предназначено для файлов, которые должны быть доступны публично. Обычно использует симлинк на storage/app/public в public/storage.

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

// Создание симлинка
// php artisan storage:link

3. Облачные хранилища

Laravel имеет встроенную поддержку популярных облачных провайдеров:

  • Amazon S3 (s3) - наиболее популярное облачное хранилище
  • FTP/SFTP - для работы с удаленными FTP-серверами
  • Rackspace/Cloud Files
  • DigitalOcean Spaces (совместим с S3 API)

Пример конфигурации для S3:

's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
    'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
],

Специализированные драйверы и адаптеры

4. scoped - Изолированные диски

Позволяют создавать диски с ограниченным доступом к определенным поддиректориям:

'scoped' => [
    'driver' => 'scoped',
    'disk' => 'local',
    'prefix' => 'user-uploads/',
],

5. Пользовательские драйверы

Можно создавать собственные драйверы, реализуя интерфейс League\Flysystem\FilesystemAdapter:

// Регистрация кастомного драйвера
Storage::extend('custom', function ($app, $config) {
    $adapter = new CustomAdapter($config['path']);
    
    return new FilesystemAdapter(
        new Filesystem($adapter, $config),
        $adapter,
        $config
    );
});

Основные возможности Filesystem API

Laravel предоставляет богатый API для работы с файлами:

// Основные операции
Storage::put('file.txt', 'Содержимое');
Storage::get('file.txt');
Storage::exists('file.txt');
Storage::download('file.txt');
Storage::delete('file.txt');
Storage::copy('old.txt', 'new.txt');
Storage::move('old.txt', 'new.txt');

// Работа с директориями
Storage::makeDirectory('folder');
Storage::deleteDirectory('folder');

// Потоковая передача файлов
Storage::putFile('photos', $request->file('photo'));

// URL и временные URL
Storage::url('file.jpg');
Storage::temporaryUrl('file.jpg', now()->addMinutes(5)); // Для S3

Выбор хранилища в зависимости от требований

Когда использовать:

  • Локальное хранилище - для файлов, которые не нужны публично, или в разработке
  • Публичное хранилище - для пользовательских загрузок (аватарки, документы)
  • Amazon S3/Cloud Storage - для продакшена, масштабирования, CDN
  • FTP/SFTP - для интеграции с существующими системами

Расширенные возможности

  1. Visibility (видимость файлов) - управление правами доступа (public/private)
  2. Метаданные - получение информации о файле (размер, MIME-тип, время изменения)
  3. Предпросмотр файлов - для браузерно-совместимых форматов
  4. Интеграция с очередями - асинхронная загрузка больших файлов
  5. Тестирование - использование фейкового хранилища (Storage::fake())

Пример использования с контроллером

class FileController extends Controller
{
    public function store(Request $request)
    {
        $path = $request->file('document')->store(
            'documents', // папка
            's3' // диск
        );
        
        return response()->json([
            'path' => $path,
            'url' => Storage::disk('s3')->url($path)
        ]);
    }
    
    public function show($filename)
    {
        // Проверка существования и прав доступа
        if (!Storage::disk('public')->exists($filename)) {
            abort(404);
        }
        
        return Storage::disk('public')->download($filename);
    }
}

Преимущества подхода Laravel

  1. Единый API для всех типов хранилищ
  2. Простая конфигурация через environment-переменные
  3. Легкое переключение между хранилищами
  4. Встроенная безопасность (валидация, MIME-типы)
  5. Интеграция с другими компонентами (валидация, формы, очереди)

Система хранения Laravel эволюционировала с версиями, и в Laravel 9-10 появились улучшения для работы с облачными хранилищами, включая улучшенную поддержку временных URL, кастомных конечных точек S3 и оптимизацию производительности при работе с большими объемами файлов.

Какие знаешь типы хранилищ в Laravel? | PrepBro