snewer / yii2-storage
Installs: 567
Dependents: 2
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:yii2-extension
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
не зависит от названия хранилища. То есть в рамках одной и той же
модели можно организовать сложную логику хранения файлов в различных
хранилищах и легким управлением ими.