Компонент распространяется как composer пакет и устанавливается командой
php composer.phar require snewer/yii2-storage
или добавлением
"snewer/yii2-storage": "*"
в composer.json файл проекта.
Задача компонента — предоставление интерфейса для реализации хранилищ и их использование.
Компонент имеет только одно свойство buckets
, в котором
необходимо указать массив конфигураций хранилищ.
Важно! Ключами массива являются названия хранилищ, по которым в дальнейшем получается экземпляр хранилища.
Пример подключения компонента в проект:
[
// ...
'components' => [
//...
'storage' => [
'class' => 'snewer\storage\StorageManager',
'buckets' => []
],
//...
],
// ...
]
\
Под хранилищем понимается реализация интерфейса
абстрактного класса snewer\storage\AbstractBucket
позволяющая:
из какой-либо системы (например, файловой) или какого-либо сервиса (например, 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
не зависит от названия хранилища. То есть в рамках одной и той же
модели можно организовать сложную логику хранения файлов в различных
хранилищах и легким управлением ими.
Comments