Validation 如何实现为cakephp 3创建的可重用验证器?

Validation 如何实现为cakephp 3创建的可重用验证器?,validation,cakephp,cakephp-3.x,Validation,Cakephp,Cakephp 3.x,我创建了一个验证规则,检查url是否确实存在。如果我在我的表验证器中将其作为自定义规则实现,我可以使其正常工作。然而,我想让它可重复使用。。。我尝试了几种不同的方法,或者被告知该方法不存在或找不到,或者我正在调用NULL上的成员函数 我当前的错误是: 错误:在null上调用成员函数add() 我对MVC编程相当陌生,对Cakephp也非常陌生 根据文档(以及我对它的理解),这里是我的新验证器类: <?php // In src/Model/Validation/ContactValidat

我创建了一个验证规则,检查url是否确实存在。如果我在我的表验证器中将其作为自定义规则实现,我可以使其正常工作。然而,我想让它可重复使用。。。我尝试了几种不同的方法,或者被告知该方法不存在或找不到,或者我正在调用NULL上的成员函数 我当前的错误是:

错误:在null上调用成员函数add()

我对MVC编程相当陌生,对Cakephp也非常陌生

根据文档(以及我对它的理解),这里是我的新验证器类:

<?php
// In src/Model/Validation/ContactValidator.php
namespace App\Model\Validation;

use Cake\Validation\Validator;

class ContactValidator extends Validator
{
    public function __construct()
    {
        parent::__construct();
        $validator
            ->add('validDomain','custom',[
                'rule' => function($value){
                $url = parse_url($value);
                $host = $url['host'];
                if($host != gethostbyname($host)){
                    return true;
                }
                return false;
            }
        ]);

    }
}
?>

这是我的表(我已经删除了所有的验证器规则,但这个示例中我正在尝试使用的规则除外):


只需创建一个Validator类的对象

public function __construct()
{
    parent::__construct();
    $validator = new Validator();
    $validator
        ->add('validDomain','custom',[
            'rule' => function($value){
            $url = parse_url($value);
            $host = $url['host'];
            if($host != gethostbyname($host)){
                return true;
            }
            return false;
        }
    ]);

}
我想这就是你想要的。祝你好运
public function __construct()
{
    parent::__construct();
    $validator = new Validator();
    $validator
        ->add('validDomain','custom',[
            'rule' => function($value){
            $url = parse_url($value);
            $host = $url['host'];
            if($host != gethostbyname($host)){
                return true;
            }
            return false;
        }
    ]);

}