PHP 数据验证:从内置函数到专业库
数据验证是安全稳定 Web 应用程序的基石之一。PHP 提供了多种方法:从简单的内置函数到实现“责任链”模式并支持复杂验证场景的强大库。在本文中,我们将介绍三种流行的 PHP 验证工具:Respect\\Validation、Symfony Validator 和 Aura.Filter,同时也会回顾语言的内置功能。
1. PHP 内置函数
在引入第三方库之前,值得记住 PHP 提供了用于过滤和验证数据的基本工具:
filter_var()— 根据过滤器(email、URL、integer 等)检查和清理数据preg_match()— 根据正则表达式进行检查empty()、is_numeric()、strlen()— 简单检查ctype_alpha()、ctype_digit()— 检查字符集
filter_var 使用示例:
<?php$email = "user@example.com";if (filter_var($email, FILTER_VALIDATE_EMAIL)) { echo "Email 有效";} else { echo "无效的 Email";}?>2. Respect\\Validation
Respect\\Validation 是 PHP 中最流行的验证库之一。其主要优势是可读的链式语法(fluent interface)以及大量现成的规则(超过 100 个)。
安装
composer require respect/validation使用示例
<?phpuse Respect\\Validation\\Validator as v;
$user = [ 'name' => '伊万', 'email' => 'ivan@test.com', 'age' => 25, 'website' => 'https://example.com'];
$validator = v::key('name', v::stringType()->length(2, 50)) ->key('email', v::email()) ->key('age', v::intType()->between(18, 120)) ->key('website', v::optional(v::url()));
try { $validator->assert($user); echo "数据有效!";} catch (\\Respect\\Validation\\Exceptions\\NestedValidationException $e) { print_r($e->getMessages());}?>该库支持自定义错误消息、嵌套数组验证,并允许通过 allOf()、oneOf() 和 noneOf() 组合规则。
3. Symfony Validator
Symfony Validator 组件是 Symfony 生态系统的一部分,但也可以单独使用。它是验证复杂数据结构的行业标准,支持注解、XML 和 YAML 配置。
安装
composer require symfony/validator使用属性(PHP 8+)的示例
<?phpuse Symfony\\Component\\Validator\\Validation;use Symfony\\Component\\Validator\\Constraints as Assert;
class User{ #[Assert\\NotBlank] #[Assert\\Length(min: 2, max: 50)] public string $name;
#[Assert\\NotBlank] #[Assert\\Email] public string $email;
#[Assert\\NotBlank] #[Assert\\Positive] #[Assert\\LessThan(150)] public int $age;}
$user = new User();$user->name = '伊万';$user->email = 'ivan@test.com';$user->age = 25;
$validator = Validation::createValidatorBuilder() ->enableAttributeMapping() ->getValidator();
$violations = $validator->validate($user);
if (count($violations) === 0) { echo "验证通过!";} else { foreach ($violations as $violation) { echo $violation->getPropertyPath() . ': ' . $violation->getMessage() . ""; }}?>Symfony Validator 支持验证组、级联验证