【问题标题】:Best way to add custom validation method in a CodeIgniter 4 module在 CodeIgniter 4 模块中添加自定义验证方法的最佳方法
【发布时间】:2021-06-11 23:31:34
【问题描述】:

这就是问题所在。 我有一个名为 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 文档中关于注册商的内容很少。我是否误解了它们的工作原理以及应该如何使用它们?

【问题讨论】:

    标签: codeigniter-4


    【解决方案1】:

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

    例如,我想编写自己的身份验证模块并使用自己的一组规则。我的自定义验证类位于 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”的实例,所以我不得不对其进行扩展。但可能还有其他方法。

    欢迎指正:)

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多