landlib / symfonytoolsbundle
Symfony 3.4 装饰控制器工具生成服务配置,用于覆盖第三方扩展包的控制器。FileUploader 服务为最简单的配置 FileType 输入与 FormBuilderInterface。
Requires
- php: ^7.2. || ^7.2.1
- liip/imagine-bundle: ~2.2.0
This package is auto-updated.
Last update: 2024-09-10 19:55:06 UTC
README
内容 / 内容
En
内容
关于
这个工具旨在更舒适地使用 Symfony。
安装
composer require landlib/symfonytoolsbundle
在您的 config/bundles.php 中添加
数组项
return [ // ... Landlib\SymfonyToolsBundle\SymfonyToolsBundle::class => ['all' => true] ];
服务
FileUploaderService
FileUploader 服务用于在 Symfony 中上传文件的最简单配置。
包含用于配置 FileType 输入的方法与 FormBuilderInterface(设置约束、设置允许上传的 mime 类型、设置消息)。
提供 upload 方法。
支持 LiipImagineBundle 过滤器,用于调整上传的图像文件大小。
已在 Symfony 3.4 项目中进行测试。
示例设置
将 FileUploaderService 对象放入控制器中的表单选项。
在 FormType 类中使用它以简单配置文件上传表单输入。
控制器
use Landlib\SymfonyToolsBundle\Service\FileUploaderService; //... public function addAdvertAction(Request, $oRequest, FileUploaderService $oFileUploaderService) { $this->_oForm = $oForm = $this->createForm(get_class(new AdvertForm()), $this->_oAdvert, [ 'file_uploader' => $oFileUploaderService, 'request' => $oRequest, //$this->_subdir - relative path to target files folder, for example 'images' 'uploaddir' => $this->_subdir ]); }
FormType.buildForm
在 FormType 类中使用 FileUploaderService 对象以简单配置文件上传表单输入。
public function buildForm(FormBuilderInterface $oBuilder, array $options) { //... // Get FileUploaderService $this->_oFileUploader = $options['file_uploader']; $this->_oRequest = $options['request']; //Set allowed for upload mime Types $this->_oFileUploader->addAllowMimetype('image/jpeg'); $this->_oFileUploader->addAllowMimetype('image/png'); $this->_oFileUploader->addAllowMimetype('image/gif'); //Set file input label $this->_oFileUploader->setFileInputLabel('Append file!'); //Set message, which will display if file type was not allowed $this->_oFileUploader->setMimeWarningMessage('Choose allowed file type'); //Set maximum allowed image height $this->_oFileUploader->setMaxImageHeight(480); //Set maximum allowed image width $this->_oFileUploader->setMaxImageWidth(640); //You can use LiipImagineBundle for resize your files after upload //See https://symfony.com.cn/doc/2.0/bundles/LiipImagineBundle/filters/sizing.html#relative-resize for create 'max_width' filter ('my_widen_filter' in Liip documentation). $this->_oFileUploader->addLiipBundleFilter('max_width'); //Set directory for upload files $subdir = $options['uploaddir']; $sTargetDirectory = $this->_oRequest->server->get('DOCUMENT_ROOT') . '/' . $subdir; $this->_oFileUploader->setTargetDirectory($sTargetDirectory); //Get options array $aOptions = $this->_oFileUploader->getFileTypeOptions(); $aOptions['translation_domain'] = 'Adform'; //And add FileInput on your form $oBuilder->add('imagefile', FileType::class, $aOptions); }
示例保存
控制器
在控制器中调用 upload 方法。
//... public function addAdvertAction(Request, $oRequest, FileUploaderService $oFileUploaderService) { //Create form $this->_oForm = $oForm = $this->createForm(get_class(new AdvertForm()), $this->_oAdvert, [ 'file_uploader' => $oFileUploaderService, 'request' => $oRequest, //$this->_subdir - relative path to target files folder, for example 'images' 'uploaddir' => $this->_subdir ]); //Processing form data if ($this->_oForm->isValid()) { //save file $oFile = $this->_oForm['imagefile']->getData(); if ($oFile) { //$sFileName will containts short file name (for example '1dsfd.jpeg') $sFileName = $this->_oFileUploaderService->upload($oFile); //For example App\Entity\Advert.imageLink must containts attribute src value of image tag $this->_oAdvert->setImageLink('/' . $this->_subdir . '/' . $sFileName); } // ... } }
示例 LiipImagineBundle 配置
它适用于使用 Symfony CLI 4.7.3 创建的 Symfony 3.4 项目。
# file src/config/packages/liip_imagine.yaml liip_imagine: resolvers: default: web_path: web_root: "%kernel.project_dir%/public" cache_prefix: "images/cache" loaders: default: filesystem: data_root: "%kernel.project_dir%/public/" driver: "gd" cache: default data_loader: default default_image: null controller: filter_action: liip_imagine.controller:filterAction filter_runtime_action: liip_imagine.controller:filterRuntimeAction filter_sets: cache: ~ # name our second filter set "my_widen_filter" max_width: quality: 75 filters: # use and setup the "relative_resize" filter relative_resize: # given 50x40px, output 32x26px using "widen" option widen: 240 # the name of the "filter set" my_thumb: # adjust the image quality to 75% quality: 75 # list of transformations to apply (the "filters") filters: # create a thumbnail: set size to 240x150 and use the "outbound" mode # to crop the image when the size ratio of the input differs thumbnail: { size: [240, 150], mode: outbound } # create a 2px black border: center the thumbnail on a black background # 4px larger to create a 2px border around the final image background: { size: [244, 154], position: center, color: '#000000' }
# file src/config/routes/liip_routes.yaml liip_imagine_filter_runtime: path: /media/cache/resolve/{filter}/rc/{hash}/{path} defaults: _controller: '%liip_imagine.controller.filter_runtime_action%' methods: - GET requirements: filter: '[A-z0-9_-]*' path: .+ liip_imagine_filter: path: /media/cache/resolve/{filter}/{path} defaults: _controller: '%liip_imagine.controller.filter_action%' methods: - GET requirements: filter: '[A-z0-9_-]*' path: .+
命令
landlib:decorate-controller
关于
当我决定装饰 FOSUserBundle ResettingController 控制器时,发现编写新的服务注册配置很困难。除了必须找到原始控制器接受的所有服务的别名之外,我还必须编写一个类,几乎所有的方法都只是调用装饰控制器的相应方法(这很无聊!)。
我们希望尽可能多地使用现成的解决方案,这意味着从第三方扩展包装饰控制器将变得很常规。
因为我创建了命令
php bin/console landlib:decorate-controller
它为装饰所需服务的控制器类创建了一个“空白”,并在 stdout 中显示新服务的 yaml 配置片段。您只需将此配置复制到您的
config/services.yaml.
生成的控制器已经包含了原始控制器所有方法的包装器。
安装
参见 [安装](#install.
用法
例如装饰 FOS\UserBundle\Controller\ResettingController
php bin/console landlib:decorate-controller
命令将要求输入覆盖控制器的路径。需要输入绝对路径,例如
/home/user/sym3.4project/vendor/friendsofsymfony/user-bundle/Controller/ResettingController.php
在请求命令后,将生成文件
/home/user/sym3.4project/src/Controller/ResettingController.php
如果文件已存在,则将覆盖或删除!不保存副本。
并将输出配置的 yaml 片段
Add in your configuration config/services.yaml:
==================
App\Controller\ResettingController:
decorates: fos_user.resetting.controller
arguments:
- '@App\Controller\ResettingController.inner'
- '@event_dispatcher'
- '@fos_user.resetting.form.factory'
- '@fos_user.user_manager'
- '@fos_user.util.token_generator'
- '@fos_user.mailer'
- '%fos_user.resetting.retry_ttl%'
- '@service_container'
==================
Remember to change the name of the controller in the routes or annotation file.
请注意输出的最后一行,对于您想要重新加载的动作的路由(或路由),必须手动调整路由配置!(因为团队无法知道您想覆盖哪些控制器动作)。
问题
如果在过程中突然看到错误 Cannot autowire service ...,那么您忘记将配置片段复制到您的 services.yaml。
您可以删除文件
/home/user/sym3.4project/src/Controller/ResettingController.php
(例如,示例 用法 部分)。
或将 yaml 配置片段追加到您的 services.yaml。
landlib:service-alias
关于
您可以使用命令快速获取服务别名
php bin/console landlib:service-alias
安装
参见安装。
用法
例如,获取FOSUserBundle的服务别名FOS\UserBundle\Controller\ResettingController
php bin/console landlib:service-alias
命令将要求输入完整的类名。需要输入带有命名空间,例如
FOS\UserBundle\Controller\ResettingController
请求命令后,将输出
Your service alias:
==================
fos_user.resetting.controller
==================
Ru
内容
这是什么
这是一组工具,用于更方便地使用Symfony。
安装
composer require landlib/symfonytoolsbundle
将元素添加到您的config/bundles.php
数组元素
return [ // ... Landlib\SymfonyToolsBundle\SymfonyToolsBundle::class => ['all' => true] ];
服务(Services)
FileUploaderService
FileUploader Service用于在Symfony中最大限度地简化文件上传操作。
包含用于方便设置FormBuilderInterface中FileType字段的多个方法(设置限制、设置允许上传的MIME类型、设置显示消息)。
提供方便的upload方法用于保存上传的文件。
支持LiipImagineBundle的过滤器,用于调整上传图像文件的大小和缩放。
在Symfony 3.4的项目中进行了验证。
示例设置
将FileUploaderService对象传递给控制器中的表单参数。
在FormType类中使用它,以简单配置文件上传表单。
控制器
use Landlib\SymfonyToolsBundle\Service\FileUploaderService; //... public function addAdvertAction(Request, $oRequest, FileUploaderService $oFileUploaderService) { $this->_oForm = $oForm = $this->createForm(get_class(new AdvertForm()), $this->_oAdvert, [ 'file_uploader' => $oFileUploaderService, 'request' => $oRequest, //$this->_subdir - относительный путь к папке с сохраняемыми файлами, например 'images' 'uploaddir' => $this->_subdir ]); }
FormType.buildForm
在表单类中使用FileUploaderService实例以方便配置文件上传输入。
public function buildForm(FormBuilderInterface $oBuilder, array $options) { //... // Получить экземпляр FileUploaderService $this->_oFileUploader = $options['file_uploader']; $this->_oRequest = $options['request']; //Установить типы файлов, допустимые для загрузки $this->_oFileUploader->addAllowMimetype('image/jpeg'); $this->_oFileUploader->addAllowMimetype('image/png'); $this->_oFileUploader->addAllowMimetype('image/gif'); //Установить метку инпута выбора файлов $this->_oFileUploader->setFileInputLabel('Choose file'); //Установить собщение, которое показывается при загрузке файла недопустимого типа $this->_oFileUploader->setMimeWarningMessage('Choose allowed file type'); //Установить максимально допустимый размер для изображений $this->_oFileUploader->setMaxImageHeight(480); $this->_oFileUploader->setMaxImageWidth(640); //Вы можете использовать LiipImagineBundle для изменения размера ваших файлов после загрузки //Смотрите https://symfony.com.cn/doc/2.0/bundles/LiipImagineBundle/filters/sizing.html#relative-resize // для создания фильтра 'max_width' ('my_widen_filter' в документации Liip). $this->_oFileUploader->addLiipBundleFilter('max_width'); //Установите каталог для хранения загруженных файлов $subdir = $options['uploaddir']; $sTargetDirectory = $this->_oRequest->server->get('DOCUMENT_ROOT') . '/' . $subdir; $this->_oFileUploader->setTargetDirectory($sTargetDirectory); //Получите массив конфигурации $aOptions = $this->_oFileUploader->getFileTypeOptions(); //Можете добавить в него дополнительные опции $aOptions['translation_domain'] = 'Adform'; //И добавьте FileInput на вашу форму $oBuilder->add('imagefile', FileType::class, $aOptions); }
示例保存
控制器
在控制器中调用upload方法。
//... public function addAdvertAction(Request, $oRequest, FileUploaderService $oFileUploaderService) { //Создание формы $this->_oForm = $oForm = $this->createForm(get_class(new AdvertForm()), $this->_oAdvert, [ 'file_uploader' => $oFileUploaderService, 'request' => $oRequest, //$this->_subdir - относительный путь к каталогу с файлами, например 'images' 'uploaddir' => $this->_subdir ]); //Processing form data if ($this->_oForm->isValid()) { //save file $oFile = $this->_oForm['imagefile']->getData(); if ($oFile) { //$sFileName will containts short file name (for example '1dsfd.jpeg') $sFileName = $this->_oFileUploaderService->upload($oFile); //For example App\Entity\Advert.imageLink must containts attribute src value of image tag $this->_oAdvert->setImageLink('/' . $this->_subdir . '/' . $sFileName); } // ... } }
LiipImagineBundle的配置示例
这适用于使用Symfony CLI 4.7.3创建的Symfony 3.4项目
# file config/packages/liip_imagine.yaml liip_imagine: resolvers: default: web_path: web_root: "%kernel.project_dir%/public" cache_prefix: "images/cache" loaders: default: filesystem: data_root: "%kernel.project_dir%/public/" driver: "gd" cache: default data_loader: default default_image: null controller: filter_action: liip_imagine.controller:filterAction filter_runtime_action: liip_imagine.controller:filterRuntimeAction filter_sets: cache: ~ # name our second filter set "my_widen_filter" max_width: quality: 75 filters: # use and setup the "relative_resize" filter relative_resize: # given 50x40px, output 32x26px using "widen" option widen: 240 # the name of the "filter set" my_thumb: # adjust the image quality to 75% quality: 75 # list of transformations to apply (the "filters") filters: # create a thumbnail: set size to 240x150 and use the "outbound" mode # to crop the image when the size ratio of the input differs thumbnail: { size: [240, 150], mode: outbound } # create a 2px black border: center the thumbnail on a black background # 4px larger to create a 2px border around the final image background: { size: [244, 154], position: center, color: '#000000' }
# file config/routes/liip_routes.yaml liip_imagine_filter_runtime: path: /media/cache/resolve/{filter}/rc/{hash}/{path} defaults: _controller: '%liip_imagine.controller.filter_runtime_action%' methods: - GET requirements: filter: '[A-z0-9_-]*' path: .+ liip_imagine_filter: path: /media/cache/resolve/{filter}/{path} defaults: _controller: '%liip_imagine.controller.filter_action%' methods: - GET requirements: filter: '[A-z0-9_-]*' path: .+
命令
landlib:decorate-controller
这是什么
当我决定装饰FOSUserBundle ResettingController时,发现编写新服务的配置很复杂。除了需要找到原始控制器接受的所有服务的别名外,我还需要编写几乎所有方法都只是调用装饰控制器方法的类(这很无聊!)。
我们希望尽可能多地使用好的现成解决方案,这意味着从第三方包中装饰控制器将是一项常规操作。
因此,我创建了一个控制台命令
php bin/console landlib:decorate-controller
它创建控制器装饰器的模板类,并在stdout中输出新服务的yaml配置片段。您只需将此配置复制到您的
config/services.yaml.
安装
参见安装。
使用
以下是如何装饰FOS\UserBundle\Controller\ResettingController的示例
php bin/console landlib:decorate-controller
命令将要求输入重载控制器的路径。需要输入绝对路径,例如
/home/user/sym3.4project/vendor/friendsofsymfony/user-bundle/Controller/ResettingController.php
然后命令将生成文件
/home/user/sym3.4project/src/Controller/ResettingController.php
如果文件已存在,它将被覆盖或删除!不会保存副本。
并输出yaml配置片段
Add in your configuration config/services.yaml:
==================
App\Controller\ResettingController:
decorates: fos_user.resetting.controller
arguments:
- '@App\Controller\ResettingController.inner'
- '@event_dispatcher'
- '@fos_user.resetting.form.factory'
- '@fos_user.user_manager'
- '@fos_user.util.token_generator'
- '@fos_user.mailer'
- '%fos_user.resetting.retry_ttl%'
- '@service_container'
==================
Remember to change the name of the controller in the routes or annotation file.
请注意,输出中的最后一行,需要手动修改路由配置中的路由(或路由)以加载您想要重载的操作!(因为命令无法知道您想要重载控制器中的哪些操作)。
问题
如果在处理过程中您突然看到了错误Cannot autowire service...,这意味着您忘记将配置片段复制到您的services.yaml中。
您可以选择删除文件
/home/user/sym3.4project/src/Controller/ResettingController.php
(文件路径示例来自使用部分)
或将配置片段添加到您的services.yaml中。
landlib:service-alias
这是什么
您可以使用以下方式快速获取服务别名
php bin/console landlib:service-alias
安装
参见安装。
使用
例如,从FOSUserBundle FOS\UserBundle\Controller\ResettingController获取服务别名
php bin/console landlib:service-alias
命令将要求输入完整的类名,包括命名空间,例如
FOS\UserBundle\Controller\ResettingController
然后输出
Your service alias:
==================
fos_user.resetting.controller
==================