snewer / yii2-storage
Installs: 612
Dependents: 2
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:yii2-extension
pkg:composer/snewer/yii2-storage
Requires
- yiisoft/yii2: *
README
Компонент распространяется как composer пакет и устанавливается командой
php composer.phar require snewer/yii2-storage
или добавлением
"snewer/yii2-storage": "*"
в composer.json файл проекта.
Настройка
Задача компонента — предоставление интерфейса для реализации хранилищ и их использование.
Компонент имеет только одно свойство buckets, в котором
необходимо указать массив конфигураций хранилищ.
Важно! Ключами массива являются названия хранилищ, по которым в дальнейшем получается экземпляр хранилища.
Пример подключения компонента в проект:
[
    // ...
    'components' => [
        //...
        'storage' => [
            'class' => 'snewer\storage\StorageManager',
            'buckets' => []
        ],
        //...
    ],
    // ...
]
Под хранилищем понимается реализация интерфейса
абстрактного класса snewer\storage\AbstractBucket позволяющая:
- загрузить файл
- получить содержимое файла
- удалить файл
- получить web ссылку на файл
из какой-либо системы (например, файловой) или какого-либо сервиса (например, Amazon AWS).
Таким образом, для реализации хранилища необходимо унаследоваться от абстрактного класса
snewer\storage\AbstractBucket
"Из коробки" доступен драйвер для локальной файловой системы
snewer\storage\drivers\FileSystemDriver
который имеет следующие свойства:
| Свойство | Тип | Обятательное | Значение по-умолчанию | Описание | 
|---|---|---|---|---|
| basePath | string | Да | Нет | Папка в файловой системе, куда будут загружаться файлы. | 
| baseUrl | string | array | Нет | Нет | Url до папки загрузок. Можно указать массив из нескольких путей. Тогда для каждого файла будет равномерно и однозачно выбран один из путей. * | 
| depth | int | Нет | 3 | Количество подпапок, создаваемое в загрузочной директории. | 
* Браузеры имеют лимит на одновременное подключение к серверу. Для преодоления лимита можно использовать различные домены, указывающие на один и тот же каталог.
Пример настройки компонента с использованием хранилищ:
[
    // ...
    'components' => [
        //...
        'storage' => [
            'class' => 'snewer\storage\StorageManager',
            'buckets' => [
                'images' => [
                    'class' => 'snewer\storage\drivers\FileSystemDriver',
                    'basePath' => '@frontend/web/uploads/images/',
                    'baseUrl' => '@web/uploads/images/',
                    'depth' => 4
                ],
                'documents' => [
                    'class' => 'snewer\storage\drivers\FileSystemDriver',
                    'basePath' => '@frontend/web/uploads/documents/',
                    'baseUrl' => '@web/uploads/documents/',
                    'depth' => 4
                ],
                // ...
            ]
        ],
        //...
    ],
    // ...
]
Использование
После настройки компонента использовать хранилище можно как через методы компонента, так и обращаясь непосредственно к объекту хранилища.
Пример реализации методов загрузки изображения
и получения URL ссылки на него в модели
изображения вашего проекта app\models\Image:
public static function upload($imageBinary) { $path = Yii::$app->storage->upload('images', $imageBinary, 'jpg'); $model = new self; $model->path = $path; $model->save(); return $model; }
Далее, в той же модели, добавим метод получения ссылки на изображение:
public function getUrl() { return Yii::$app->storage->getUrl('images', $this->path); }
После чего можно загружать изображения следующим образом:
$image = app\models\Image::upload($imageBinary);
и выводить изображение в каком-либо представлении:
<img src="<?= $image->url ?>">
Пример реализации тех же методов с использованием
объектов хранилищ:
public static function upload($imageBinary) { $path = Yii::$app->storage->images->upload($imageBinary, 'jpg'); $model = new self; $model->path = $path; $model->save(); return $model; } public function getUrl() { return Yii::$app->storage->images->getUrl($this->path); }
Стоит заметить, что реализация метода getUrl
не зависит от названия хранилища. То есть в рамках одной и той же
модели можно организовать сложную логику хранения файлов в различных
хранилищах и легким управлением ими.