首页 > 解决方案 > 在 CodeIgniter 4 模块中添加自定义验证方法的最佳方法

问题描述

这是问题所在。我有一个名为 Contact 的模块。它位于一个名为 modules/Contact 的目录中。我在 app/Config/Autoload.php 中为模块注册了一个命名空间联系人。一切似乎都很好。现在我想使用自定义验证方法来验证来自表单字段的输入。我的问题是关于最好的方法。我的方法如下:根据 CI4 文档,Validation 类在用于验证时会加载 App/Config/Validation.php。在文件中有一个名为 $ruleSets 的公共属性,它指向一个数组,它包含具有验证规则的类的名称。我想将我自己的带有验证方法的类添加到这个数组中。根据关于验证的 CI4 文档,可以使用注册器更新配置类及其在 App/Config/ 中的公共属性。所以,我创建了一个这样的注册商,一个类,在我的联系人模块中。它位于 Contact\Config\Registrar.php 中。该类具有公共静态方法 Validation,它返回一个包含更新的 $ruleSet 的数组。新值是一个数组,包含所有标准验证类名称 + 我的验证类名称。问题是我在注册器中添加的公共静态方法验证似乎没有更改 App/Config/ 中定义的 $ruleSet 的值。Contact/Config/Registrar.php 已加载,但未调用其中包含的 Validation 方法。那么,添加自定义验证规则而无需更新超出我的模块的文件的最佳方法是什么?CI4 文档中关于注册商的内容很少。我是否误解了它们的工作方式以及应该如何使用它们?该类具有公共静态方法 Validation,它返回一个包含更新的 $ruleSet 的数组。新值是一个数组,包含所有标准验证类名称 + 我的验证类名称。问题是我在注册器中添加的公共静态方法验证似乎没有更改 App/Config/ 中定义的 $ruleSet 的值。Contact/Config/Registrar.php 已加载,但未调用其中包含的 Validation 方法。那么,添加自定义验证规则而无需更新超出我的模块的文件的最佳方法是什么?CI4 文档中关于注册商的内容很少。我是否误解了它们的工作方式以及应该如何使用它们?该类具有公共静态方法 Validation,它返回一个包含更新的 $ruleSet 的数组。新值是一个数组,包含所有标准验证类名称 + 我的验证类名称。问题是我在注册器中添加的公共静态方法验证似乎没有更改 App/Config/ 中定义的 $ruleSet 的值。Contact/Config/Registrar.php 已加载,但未调用其中包含的 Validation 方法。那么,添加自定义验证规则而无需更新超出我的模块的文件的最佳方法是什么?CI4 文档中关于注册商的内容很少。我是否误解了它们的工作方式以及应该如何使用它们?问题是我在注册器中添加的公共静态方法验证似乎没有更改 App/Config/ 中定义的 $ruleSet 的值。Contact/Config/Registrar.php 已加载,但未调用其中包含的 Validation 方法。那么,添加自定义验证规则而无需更新超出我的模块的文件的最佳方法是什么?CI4 文档中关于注册商的内容很少。我是否误解了它们的工作方式以及应该如何使用它们?问题是我在注册器中添加的公共静态方法验证似乎没有更改 App/Config/ 中定义的 $ruleSet 的值。Contact/Config/Registrar.php 已加载,但未调用其中包含的 Validation 方法。那么,添加自定义验证规则而无需更新超出我的模块的文件的最佳方法是什么?CI4 文档中关于注册商的内容很少。我是否误解了它们的工作方式以及应该如何使用它们?s 添加自定义验证规则而无需更新超出我的模块的文件的最佳方法?CI4 文档中关于注册商的内容很少。我是否误解了它们的工作方式以及应该如何使用它们?s 添加自定义验证规则而无需更新超出我的模块的文件的最佳方法?CI4 文档中关于注册商的内容很少。我是否误解了它们的工作方式以及应该如何使用它们?

标签: codeigniter-4

解决方案


我遇到了同样的问题,我的解决方案是扩展验证类(总是欢迎更好的解决方案)。

例如,我想编写自己的 Auth 模块并使用自己的规则集。我的自定义验证类位于 acme/Auth/Config/AuthValidation.php 下

<?php
namespace Acme\Auth\Config;

use Config\Validation;

class AuthValidation extends Validation
{
  public $login = [
    'username'     => 'required',
    'password'     => 'required',
  ];
}

这样,您的主应用程序中的所有验证规则都会被继承。您将在控制器中使用此代码来验证:

<?php

namespace Acme\Auth\Controllers;

use CodeIgniter\Controller;
use Acme\Auth\Config\AuthValidation as AuthValidation;

class Auth extends Controller
{
    public function login()
    {
      //Instantiate the new AuthValidation class
      $authValidationConfig = new AuthValidation();
      
      //Since the validation class is a config for the validation service we set it for the validation service 
      $authValidation =  \Config\Services::validation($authValidationConfig);
      
      //Set the login rule from our AuthValidation class
      $authValidation->setRuleGroup('login');

      //Validate the request against our login rule
      if($authValidation->withRequest($this->request)->run())
      {
        return 'Success';
      }
      else
      {
        return 'Failure';
      }
    }
}

这可能不是最好的解决方案,因为我对 CodeIgniter 还很陌生,但这就是我找到解决方法的方式。

旁注:主要问题似乎是传递给验证服务构造函数的类必须是“Config\Validation”的实例,所以我不得不扩展它。但是可能还有其他方法可以解决它。

随时纠正我:)


推荐阅读