Https://neoacevedo.gumroad.com/l/yii2-storage

Yii2 component for storage management in cloud. It supports AWS S3, Azure Blob Storage, Google Cloud Storage but also it can be used for local storage.

#yii2 #php #dev #component #extension #azureblobstorage #azurefilestorage #googlecloudstorage #s3 #aws

Yii2 Storage

Yii2 Storage A complete extension for file storage management in Yii2 that supports multiple cloud and local storage providers.Features ✅ Multiple providers: Amazon S3, Azure Blob Storage, Google Cloud Storage and local storage ✅ File validation: Control of allowed file extensions and types ✅ Flexible configuration: Support for path prefixes and custom configurations ✅ Easy integration: Compatible with Yii2 forms and models ✅ URL management: Automatic generation of public URLs for files Tags: #storage #component #upload #file #extension #aws #azure #google #yii2Demo. File upload form is in the index.InstallationThis extension is distributed as a ZIP file that must be manually extracted.This documentation asumes the user is familiar with AWS S3, Azure Blob Storage and/or Google Cloud Storage service(s).Installation steps: Download the yii2-storage component ZIP file Extract to a directory of your choice within the project:components/neoacevedo/yii2-storage/ Configure repository in your composer.json project:"repositories": [ { "type": "composer", "url": "https://asset-packagist.org" }, { "type": "path", "name": "neoacevedo/yii2-storage", "url": "components/neoacevedo/yii2-storage" } ] Regenerate autoloader:Option 1: Direct installation composer require neoacevedo/yii2-storage Option 2: Add to the require section of your composer.json project { "require": { "neoacevedo/yii2-storage": "dev-main" } } Then run:composer update ConfigurationOnce the extension is installed, configure the storage component in your Yii2 application configuration file (config/web.php or common/config/main.php):Amazon S3'components' => [ 'storage' => [ 'class' => 'neoacevedo\yii2\storage\S3Storage', 'accessKey' => 'YOUR_IAM_ACCESS_KEY', 'secretAccessKey' => 'YOUR_IAM_SECRET_ACCESS_KEY', 'bucket' => 'your-bucket-name', 'region' => 'us-east-1', // AWS Region 'directory' => 'uploads/', // Directory within the bucket (optional) 'acl' => 'public-read', // File ACL (optional) 'storageClass' => 'STANDARD', // Storage class (optional) 'presignedUrl' => true, // Signed URLs (optional) 'presignedUrlExpiration' => '+1 hour', // Expiration time (optional) 'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp,doc,docx,xls,xlsx' ], ], Azure Blob Storage'components' => [ 'storage' => [ 'class' => 'neoacevedo\yii2\storage\AzureBlobStorage', 'accountName' => 'YOUR_STORAGE_ACCOUNT_NAME', 'accountKey' => 'YOUR_STORAGE_ACCOUNT_KEY', 'container' => 'your-container-name', 'directory' => 'uploads/', // Directory within the container (optional) 'cdn' => 'https://your-cdn.azureedge.net', // CDN URL (optional) 'hierarchicalNamespace' => false, // true for Data Lake Gen2 (optional) 'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp,doc,docx,xls,xlsx' ], ], Google Cloud Storage'components' => [ 'storage' => [ 'class' => 'neoacevedo\yii2\storage\GoogleCloudStorage', 'projectId' => 'YOUR_PROJECT_ID', 'bucket' => 'your-bucket-name', 'keyFileContent' => file_get_contents('/path/to/service-account-key.json'), // JSON file content 'directory' => 'uploads/', // Directory within the bucket (optional) 'cdn' => 'https://your-cdn.googleusercontent.com', // CDN URL (optional) 'presignedUrl' => true, // Signed URLs (optional) 'presignedUrlExpiration' => 3600, // Expiration time in seconds (optional) 'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp,doc,docx,xls,xlsx' ], ], Local Storage'components' => [ 'storage' => [ 'class' => 'neoacevedo\yii2\storage\LocalStorage', 'directory' => '@webroot/uploads/', // Physical storage directory 'cdn' => 'https://your-cdn.com', // CDN URL (optional) 'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp,doc,docx,xls,xlsx' ], ], UsageBasic Usage with Component<?php // In your controller use yii\web\UploadedFile; public function actionUpload() { $fileManager = Yii::$app->storage->getFileManager(); if (Yii::$app->request->isPost) { $fileManager->uploadedFile = UploadedFile::getInstance($fileManager, 'uploadedFile'); if ($fileManager->validate() && Yii::$app->storage->save($fileManager)) { // File uploaded successfully $fileUrl = Yii::$app->storage->getUrl($fileManager->fileName); Yii::$app->session->setFlash('success', 'File uploaded successfully: ' . $fileUrl); } else { Yii::$app->session->setFlash('error', 'Error uploading file.'); } } return $this->render('upload', ['fileManager' => $fileManager]); } Direct Usage without Component<?php use neoacevedo\yii2\storage\S3Storage; use yii\web\UploadedFile; public function actionUpload() { $storage = new S3Storage([ 'accessKey' => 'YOUR_IAM_ACCESS_KEY', 'secretAccessKey' => 'YOUR_IAM_SECRET_ACCESS_KEY', 'bucket' => 'your-bucket-name', 'region' => 'us-east-1', 'directory' => 'uploads/', 'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp' ]); $fileManager = $storage->getFileManager(); $fileManager->uploadedFile = UploadedFile::getInstance($fileManager, 'uploadedFile'); if ($storage->save($fileManager)) { return $storage->getUrl($fileManager->fileName); } return false; } Form IntegrationIn the Controller:public function actionCreate() { $model = new YourModel(); $fileManager = Yii::$app->storage->getFileManager(); if ($model->load(Yii::$app->request->post())) { $fileManager->uploadedFile = UploadedFile::getInstance($fileManager, 'uploadedFile'); if ($fileManager->validate() && Yii::$app->storage->save($fileManager)) { $model->file_path = $fileManager->fileName; if ($model->save()) { return $this->redirect(['view', 'id' => $model->id]); } } } return $this->render('create', [ 'model' => $model, 'fileManager' => $fileManager ]); } In the View:<?php use yii\widgets\ActiveForm; $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?> <?= $form->field($model, 'name')->textInput() ?> <?= $form->field($fileManager, 'uploadedFile')->fileInput([ 'accept' => 'image/*,.pdf,.doc,.docx', 'class' => 'form-control' ]) ?> <div class="form-group"> <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?> </div> <?php ActiveForm::end(); ?> Available Methods// Get file manager $fileManager = Yii::$app->storage->getFileManager(); // Save file $success = Yii::$app->storage->save($fileManager); // Get file URL $url = Yii::$app->storage->getUrl('filename.jpg'); // Delete file $deleted = Yii::$app->storage->delete('filename.jpg'); // List of files/directories in the bucket. Optional: directory name ending with '/' to list its contents. $files = Yii::$app->storage->list(); Advanced Configuration ExamplesMultiple Configuration'components' => [ 'storageImages' => [ 'class' => 'neoacevedo\yii2\storage\S3Storage', 'accessKey' => 'YOUR_ACCESS_KEY', 'secretAccessKey' => 'YOUR_SECRET_KEY', 'bucket' => 'images-bucket', 'region' => 'us-east-1', 'directory' => 'images/', 'allowedExtensions' => 'jpg,jpeg,gif,png,bmp' ], 'storageDocuments' => [ 'class' => 'neoacevedo\yii2\storage\S3Storage', 'accessKey' => 'YOUR_ACCESS_KEY', 'secretAccessKey' => 'YOUR_SECRET_KEY', 'bucket' => 'documents-bucket', 'region' => 'us-east-1', 'directory' => 'documents/', 'allowedExtensions' => 'pdf,doc,docx,xls,xlsx' ], ], LicenseThis project is licensed under the GPLv3 License. See LICENSE file for more details.SupportIf you encounter any issues or have questions, please send an email to [email protected].

Gumroad

@yii FYI, currently "asset-packages" experience issues and `composer update` can't pass as it doens't find any `bower-asset/*` composer package. 2nd time in 2 weeks. If this continues may be it's a good idea to put some public advice on a recommended alternative...

#yii2

https://ko-fi.com/s/042ead1675

I've made this little Yii2 component for storage management in cloud. It supports AWS S3, Azure Blob Storage, Google Cloud Storage but also it can be used for local storage.

#yii2 #php #dev #component #extension

Yii2 Storage - neoacevedo's Ko-fi Shop

A complete extension for file storage management in Yii2 that supports multiple cloud and local storage providers. Features - ✅ Multiple providers:...

Ko-fi
Going through a thread... how do you make #PHPStan work acceptably in a project with AR that heavily uses magic methods ? #Yii2 dinosaur project needed some good exception for a rule explicitly for the models... I guess class property phpdoc should help but if I ask for it, the guys will murder me ...

Folks, i need a job or a contract so bad. I'm a full-stack developer, i work in several frameworks (including #laravel and #yii2), and with several CMSes (notably #craftcms and #expressionengine but i can also work in Wordpress). I've got SQL wizard skills and a deep focus on #a11y and solid, maintainable, semantic HTML and CSS on the front end. Please hire me!

I'm a dual US/Canadian citizen and prefer fully remote work but can also do in-office in Vancouver/the Lower Mainland area.

#fedihire

Has anyone manages to get out a #codeception remote #coverage (selenium) report different from 0. I have an #yii2 #php app and after 2h of struggle I made run but c3 reports 0lines coverage...

Simplifying many-to-many relationships in #Yii2 with my open-source package: yii2-m2m-behavior
👉 https://dev.to/jonatas-sas/simplify-many-to-many-relationships-in-yii2-with-yii2-m2m-behavior-59lk

✅ Cleaner code
✅ Native AR integration
✅ No boilerplate relations

#PHP #Yii2 #OpenSource #Backend #Dev

Simplify Many-to-Many Relationships in Yii2 with yii2-m2m-behavior

Managing many-to-many relationships in Yii2 just got a lot easier. The yii2-m2m-behavior package...

DEV Community

Внедряем метрики OpenTelemetry в PHP проект на Yii2

Сегодня поговорим о том, как внедрить метрики в формате OpenTelemetry в PHP монолит, построенный на фреймворке Yii2. Спойлер: как оказалось, на этой задаче можно пару раз разочароваться в бытии разработчика сломать голову на способе сбора, отправке, промежуточных звеньях и сломанных гистограммах.

https://habr.com/ru/articles/904654/

#yii2 #opentelemetry

Внедряем метрики OpenTelemetry в PHP проект на Yii2

Сегодня поговорим о том, как внедрить метрики в формате OpenTelemetry в PHP монолит, построенный на фреймворке Yii2. Спойлер: как оказалось, на этой задаче можно пару раз разочароваться в бытии...

Хабр

Переход на Symfony в заскорузлом Yii2 монолите: подробный разбор

Полгода назад мне посчастливилось решать интересную и нетипичную задачу по затаскиванию Symfony в Yii2 монолит. В данном материале я подробно и пошагово распишу весь процесс решения этой задачи с пояснениями, почему были выбраны именно такие решения и как это работает.

https://habr.com/ru/articles/880196/

#symfony #yii2 #php #монолит #фреймфорки

Переход на Symfony в заскорузлом Yii2 монолите: подробный разбор

Полгода назад мне посчастливилось решать интересную и нетипичную задачу по затаскиванию Symfony в Yii2 монолит. Вводные были такими: Объем кодовой базы 180+ тысяч строк PHP кода. Монолит долгое время...

Хабр
Some inconsistencies in #Yii2 drive me nuts. I need to perform some DB actions on different databases in a loop. I don't want to switch the DB connection of the base ActiveRecord class as I may want to do a select from one DB and a save to another DB on same model. So I saw `ActiveQuery::one/all` methods have the optional parameter of the DB connection. That's awesome, but `findOne` which is used all over doesn't bother having a `Connection` paramater and respectively doesn't pass it. DAMN