PHP 怎么PHP 自定义规则

wen PHP项目 1

本文目录导读:

PHP 怎么PHP 自定义规则

  1. 自定义验证规则
  2. 自定义配置规则
  3. 自定义业务规则引擎
  4. 使用 YAML/JSON 配置文件定义规则
  5. 使用设计模式实现规则

我来详细介绍 PHP 自定义规则的几种常见方式:

自定义验证规则

使用正则表达式验证

<?php
class CustomValidator {
    public static function validatePhone($phone) {
        // 自定义手机号规则
        $pattern = '/^1[3-9]\d{9}$/';
        return preg_match($pattern, $phone) === 1;
    }
    public static function validatePassword($password) {
        // 密码规则:至少8位,包含大小写字母和数字
        $pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/';
        return preg_match($pattern, $password) === 1;
    }
}
// 使用示例
$phone = '13800138000';
if (CustomValidator::validatePhone($phone)) {
    echo "手机号格式正确";
}

自定义配置规则

配置规则数组

<?php
class RuleEngine {
    private $rules = [];
    // 添加规则
    public function addRule($name, $callback) {
        $this->rules[$name] = $callback;
    }
    // 执行规则
    public function executeRule($name, $data) {
        if (isset($this->rules[$name])) {
            return call_user_func($this->rules[$name], $data);
        }
        throw new Exception("规则 '{$name}' 不存在");
    }
    // 批量执行规则
    public function executeRules($data, $ruleNames) {
        $results = [];
        foreach ($ruleNames as $name) {
            $results[$name] = $this->executeRule($name, $data);
        }
        return $results;
    }
}
// 使用示例
$engine = new RuleEngine();
// 添加自定义规则
$engine->addRule('min_length', function($data) {
    return strlen($data) >= 6;
});
$engine->addRule('has_number', function($data) {
    return preg_match('/\d/', $data) === 1;
});
$engine->addRule('is_email', function($data) {
    return filter_var($data, FILTER_VALIDATE_EMAIL) !== false;
});
// 执行规则
$result = $engine->executeRules('test123', ['min_length', 'has_number']);
print_r($result);

自定义业务规则引擎

更复杂的规则系统

<?php
class BusinessRuleEngine {
    private $rules = [];
    private $conditions = [];
    // 添加条件
    public function addCondition($name, $callback) {
        $this->conditions[$name] = $callback;
    }
    // 添加规则(包含条件和动作)
    public function addRule($name, $condition, $action) {
        $this->rules[$name] = [
            'condition' => $condition,
            'action' => $action
        ];
    }
    // 执行规则
    public function evaluate($context) {
        $results = [];
        foreach ($this->rules as $name => $rule) {
            $conditionResult = call_user_func($rule['condition'], $context);
            if ($conditionResult) {
                $actionResult = call_user_func($rule['action'], $context);
                $results[$name] = [
                    'triggered' => true,
                    'result' => $actionResult
                ];
            } else {
                $results[$name] = [
                    'triggered' => false,
                    'result' => null
                ];
            }
        }
        return $results;
    }
}
// 使用示例
$engine = new BusinessRuleEngine();
// 添加条件
$engine->addCondition('is_vip', function($user) {
    return $user['level'] >= 5;
});
$engine->addCondition('order_amount', function($order) {
    return $order['amount'] > 1000;
});
// 添加业务规则
$engine->addRule(
    'vip_discount',
    function($context) {
        return $context['user']['level'] >= 5;
    },
    function($context) {
        return $context['order']['amount'] * 0.8; // 8折
    }
);
$engine->addRule(
    'free_shipping',
    function($context) {
        return $context['order']['amount'] > 500;
    },
    function($context) {
        return ['free_shipping' => true, 'discount' => 30]; // 免运费
    }
);
// 执行规则
$context = [
    'user' => ['level' => 6],
    'order' => ['amount' => 1500]
];
$results = $engine->evaluate($context);
print_r($results);

使用 YAML/JSON 配置文件定义规则

rules.yaml

validation_rules:
  username:
    required: true
    min_length: 3
    max_length: 20
    pattern: '/^[a-zA-Z0-9_]+$/'
  email:
    required: true
    pattern: '/^[\w\.-]+@[\w\.-]+\.\w+$/'
  age:
    required: false
    min: 18
    max: 120

解析配置的 PHP 代码

<?php
class RuleLoader {
    public static function loadFromYaml($filePath) {
        // 需要安装 yaml 扩展
        $yaml = yaml_parse_file($filePath);
        return $yaml;
    }
    public static function loadFromJson($jsonString) {
        return json_decode($jsonString, true);
    }
}
// 验证函数
function validateByRules($data, $rules) {
    $errors = [];
    foreach ($rules as $field => $rules) {
        $value = $data[$field] ?? null;
        if (isset($rules['required']) && $rules['required'] && empty($value)) {
            $errors[$field][] = "{$field} 是必填项";
        }
        if (isset($rules['min_length']) && strlen($value) < $rules['min_length']) {
            $errors[$field][] = "{$field} 最少需要 {$rules['min_length']} 个字符";
        }
        if (isset($rules['pattern']) && !preg_match($rules['pattern'], $value)) {
            $errors[$field][] = "{$field} 格式不正确";
        }
    }
    return $errors;
}

使用设计模式实现规则

策略模式示例

<?php
interface RuleInterface {
    public function validate($data): bool;
    public function getMessage(): string;
}
class MinLengthRule implements RuleInterface {
    private $minLength;
    private $message;
    public function __construct($minLength, $message = null) {
        $this->minLength = $minLength;
        $this->message = $message ?? "长度不能小于 {$minLength}";
    }
    public function validate($data): bool {
        return strlen($data) >= $this->minLength;
    }
    public function getMessage(): string {
        return $this->message;
    }
}
class PatternRule implements RuleInterface {
    private $pattern;
    private $message;
    public function __construct($pattern, $message = null) {
        $this->pattern = $pattern;
        $this->message = $message ?? "格式不正确";
    }
    public function validate($data): bool {
        return preg_match($this->pattern, $data) === 1;
    }
    public function getMessage(): string {
        return $this->message;
    }
}
// 使用示例
$rules = [
    new MinLengthRule(6, "密码长度至少6位"),
    new PatternRule('/[A-Z]/', "必须包含大写字母"),
    new PatternRule('/[0-9]/', "必须包含数字")
];
$password = "Test123";
foreach ($rules as $rule) {
    if (!$rule->validate($password)) {
        echo $rule->getMessage() . "\n";
    }
}

这些是 PHP 自定义规则的常见实现方式,你可以根据实际需求选择合适的方法,规则引擎可以用于表单验证、权限控制、业务逻辑判断等多种场景。

抱歉,评论功能暂时关闭!