dittto/symfony-custom-request

允许在控制器中使用自定义请求

安装量: 4,413

依赖项: 0

建议者: 0

安全: 0

星标: 3

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

1.0.0 2016-12-10 00:55 UTC

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 } ]