我应该将用户数据 sanitization/validation 实现为中间件吗?

Should I implement user data sanitization/validation as middleware?

我正在用 Slim 重新实现我的用户管理系统,我正在尝试弄清楚我应该在哪里处理用户数据sanitization/validation。我一直在阅读有关中间件的信息,我想知道这是否是实现数据验证的合适方法。

我的验证计划是对每个包含一些用户数据(即表单)的请求使用验证模式(一个简单的 JSON 文件)。但是,不同的表单显然会使用不同的schema,并且可能存在某些类型的验证无法单独由schema处理。

因此,我实现的任何中间件都必须根据路由决定使用哪个模式。此外,某些路由将需要超出模式中表示的其他验证逻辑。这对我来说听起来像是错误的方法 - 中间件不应该是公平的 "generic",在每个 request/response 上执行相同的逻辑吗?

另一种方法是在每个路由中使用适当的模式初始化某种验证对象,然后将我的 Slim 应用程序注入其中。

哪种方法更明智?

使用全局中间件没有意义,因为您最终会将每个端点的参数列表耦合在一起。

我会考虑的两个选项是:

  1. 作为路由中间件实现,这样你就可以为每个端点设置不同的filtering/validation。

    例如

    function fooFilter() {
        // filter/validate GET variables here and set back into request.
    }
    
    $app->get('/foo', 'fooFilter', function () {
        // "controller" logic
    });
    

    这样做的好处是您的控制器逻辑不需要被验证内容弄得乱七八糟,因为这已经完成了。

  2. Filter/validate 在控制器逻辑中。此处的主要优点是您可以更轻松地审核是否正在使用 GET 变量而无需先 filtered/validated。