Có lúc nào bạn cần validate data bằng validator cuả Symfony mà cần thêm các dữ liệu từ bên ngoài vào?
Sau đây mà một số cách mà mình đã sử dụng, tuỳ từng trường hợp mà áp dụng cho hợp lý.
Trước khi tiếp tục xem thì các bạn có thể đọc qua một số bài viết để có cái nhìn rõ hơn:
How to Create a custom Validation Constraint
Bài toán
Khi bạn cần thay đổi email của user A, bạn cần phải check trong database xem email này đã được sử dụng bởi user nào khác user A hay chưa. Vậy để validate thì ngoài email ra ta cần thêm thông tin của user hiện tại.
Cách 1: Pass class
1 | /** |
Ở Constraint chỉ cần thay đổi target
:
1 | class UniqueEmail extends Constraints |
Nếu muốn dùng constraint cho cả class và property thì chỉ cần:
1
2
3
4 public function getTargets()
{
return [self::CLASS_CONSTRAINT, self::PROPERTY_CONSTRAINT];
}
1 | class UniqueEmailValidator extends ConstraintValidator |
Cách 2: Tạo thêm property cho Constraint
Thêm một property cho Constraint:1
2
3
4
5
6
7
8
9
10
11class UniqueEmail extends Constraints
{
public $messsage = 'Email already exists.';
public $id;
public function validateBy()
{
return UniqueEmailValidator::class;
}
}
Lúc này có thể pass giá trị cho id
:1
2
3
4
5
6
7
8
9class User
{
private $id;
/**
* @AppAssert\UniqueEmail(id='foo')
*/
private $email;
}
1 | class UniqueEmailValidator extends ConstraintValidator |
Nếu phức tạp hơn một xíu thì bạn có thể pass vào tên của một function:
1 | class UniqueEmail extends Constraints |
1 | class User |
1 | class UniqueEmailValidator extends ConstraintValidator |
Kết bài
Mong sau bài viết này các bạn có thể hiểu thêm về Validator Constraint của Symfony và nếu có ý kiến hoặc cách nào hay ho hơn nữa thì đừng ngần ngại mà comment bên dưới nhé.