PHP 数据验证:工具与库完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 支持验证组、级联验证

推荐