dittto / symfony-custom-request
允许在控制器中使用自定义请求
This package is not auto-updated.
Last update: 2024-09-28 20:20:06 UTC
README
这是什么?
为了帮助实现“瘦控制器,胖模型”的理想,此包允许您创建自定义请求对象,您可以在它们到达控制器之前对它们进行验证。
您可以使用这些对象来确保某些字段设置了特定的动态值,或在不向控制器中添加额外逻辑的情况下验证表单数据。
目标是让控制器知道它拥有正确的数据,因此可以立即开始处理它,而不是必须再次检查输入是否有效。
新的自定义请求对象通过服务定义,因此可以传递任何其他服务。这意味着您的验证步骤可以使用其他API、数据库、Elasticsearch等数据源。
如何使用它
第一步是更新您的composer.json
文件以包含dittto/symfony-custom-request
。您可能还需要在repositories
中指定github仓库的条目。
在添加并安装此包后,您需要将其添加到AppKernel.php
文件中。
class AppKernel extends Kernel { public function registerBundles() { $bundles = [ ... new \Dittto\CustomRequestBundle\DitttoCustomRequestBundle(),
接下来,我们将创建我们的自定义请求。这将是一个简单的检查,查找包含token=allowed
的查询字符串。以下测试存储在AppBundle/Request/TestRequest.php
中。
use Dittto\CustomRequestBundle\Request\AbstractRequestType; class TestRequest extends AbstractRequestType { public function validate():bool { return $this->getOriginalRequest()->query->get('token') === 'allowed'; } }
更新我们的新TestRequest的服务。此处的tag
很重要,因为它使我们能够知道这是一个自定义请求,可以用作控制器参数。
services: test_request: class: AppBundle\Request\TestRequest tags: [ { name: dittto.request } ]
最后,我们需要告诉我们的控制器使用我们的自定义请求,并使用其参数。
class DefaultController extends Controller { public function indexAction(TestRequest $request):Response { ... } }
过滤器
有一个过滤器链可用于在validate()
方法运行后更改此代码的处理方式。默认情况下,有一个过滤器,如果GET
请求失败,则抛出一个400异常。
您可以将任意数量的附加过滤器添加到链中,以根据特定的请求类型创建自动响应。
通过创建兼容的过滤器(RequestFilterInterface
)并在定义服务时添加dittto.request_filter
标签来添加新过滤器。
要按特定顺序运行过滤器,请添加一个带有正整数值的slot
标签。它们按最低数字优先的顺序运行。如果您将2个或更多过滤器分配给同一插槽,则第一个分配的过滤器将占据该插槽,并阻止其他过滤器占据其位置。
如何覆盖默认过滤器
本地配置中的插槽似乎总是先于供应商定义的配置安装,因此您可以使用以下方法替换默认过滤器。
services: override_exception_on_failed_get: class: Dittto\CustomRequestBundle\Request\Filter\NullFilterRequest tags: [ { name: dittto.request_filter, slot: 10 } ]