landlib/symfonytoolsbundle

Symfony 3.4 装饰控制器工具生成服务配置,用于覆盖第三方扩展包的控制器。FileUploader 服务为最简单的配置 FileType 输入与 FormBuilderInterface。

dev-master 2019-12-10 09:35 UTC

This package is auto-updated.

Last update: 2024-09-10 19:55:06 UTC


README

内容 / 内容

Ru

En

En

内容

关于

服务

FileUploaderService

命令

landlib:decorate-controller

landlib:service-alias

关于

这个工具旨在更舒适地使用 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 项目中进行测试。

示例设置

示例保存

示例 liipimaginebundle 配置

示例设置

将 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

内容

这是什么

服务(Services)

FileUploaderService

命令

landlib:decorate-controller

landlib:service-alias

这是什么

这是一组工具,用于更方便地使用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的项目中进行了验证。

示例设置

示例保存

LiipImagineBundle的配置示例

示例设置

将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


==================