Symfony Validator 獨立於表單,可驗證任意 PHP 對象。核心:約束 定義規則,驗證器 執行檢查。
// 實體類
use Symfony\Component\Validator\Constraints as Assert;
class Author {
/** @Assert\NotBlank() */
public $name;
}
// 控制器中驗證
$author = new Author();
$validator = $this->get('validator');
$errors = $validator->validate($author);
if (count($errors) > 0) {
// 處理錯誤
}
@Assert\NotBlank(),需在 config.yml 開啟 enable_annotations: true。validation.yml 映射類與約束。validation.xml 結構化定義。loadValidatorMetadata(ClassMetadata $metadata) 程序化構建。| 類別 | 約束示例 |
|---|---|
| 基礎 | NotBlank, NotNull, True, False, Type |
| 字符串 | Email, Length, Url, Regex, Ip |
| 數字 | Range (Min/Max) |
| 日期 | Date, DateTime, Time |
| 集合 | Choice, Collection, UniqueEntity, Locale |
| 文件 | File, Image |
| 其他 | Callback, Valid, All |
private $firstName,支持 public/protected/private。public function isPasswordLegal(),驗證動態邏輯(如密碼不等於名字)。同一類不同場景用不同規則:
/** @Assert\Email(groups={"registration"}) */
private $email;
/** @Assert\NotBlank(groups={"registration"}) */
private $password;
// city 無分組,屬於 Default 組
// 驗證時指定組
$errors = $validator->validate($user, ['registration']);
$emailConstraint = new Email();
$emailConstraint->message = 'Invalid email';
$errors = $this->get('validator')->validateValue($email, $emailConstraint);
表單組件內部自動調用驗證器,違規轉為 FormError 附加到字段,控制器只需判斷 $form->isValid()。
Validator 組件靈活、可復用,掌握約束配置、分組、Getter 驗證、單值驗證,即可應對複雜業務校驗場景。