2017-09-14 58 views
7

Tôi đang làm việc trong một nhóm mà người dùng tạo "sự đồng ý" bằng biểu mẫu và tôi đang cố gắng kiểm tra xem người dùng vẫn có "tín dụng" hay không. Vì vậy, tôi đã tạo trình xác thực tùy chỉnh truy vấn các giao dịch trong quá khứ và đưa ra lỗi nếu tín dụng không đủ.Xác thực Symfony

Vấn đề của tôi là nếu người dùng gửi ngày có định dạng sai trong trường "ngày" (tức là 32-13-20122 24:05) Symfony vẫn cố chạy xác thực tùy chỉnh của tôi và tôi nhận được tất cả các loại lỗi (vì $comision->getDate()null và không phải là đối tượng DateTime hợp lệ).

Tôi nhận được lỗi này:

clone method called on non-object

Tôi cũng có thể kiểm tra xem giá trị của $comision->getDate() là một datetime hợp lệ trong validator tùy chỉnh của tôi, nhưng có vẻ như với tôi rằng nó nên không cần thiết kể từ khi tôi thêm này quy tắc trong thuộc tính ngày.

Đây là thực thể của tôi (giản thể)

/** 
* @MyValidation\TotalHours() 
*/ 
class Comision 
{ 

/** 
* @ORM\Column(type="datetime") 
* @Assert\DateTime() 
* @Assert\NotNull() 
*/ 
protected $date; 


/** 
* @ORM\Column(type="decimal", nullable=false, scale=1) 
* @Assert\NotBlank() 
*/ 
protected $hours; 

... 

lớp mẫu My ...

class NewComisionType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
      $builder 
       ->add('date', DateTimeType::class, array(
       'widget' => 'single_text', 
       'label' => 'Starting date and time', 
       'format' => 'dd/MM/yyyy HH:mm' 
       )) 
       ->add('hours', ChoiceType::class, array(
        'label'=> 'How many hours', 
        'choices' => array(
         '1:00' => 1, 
         '1:30' => 1.5, 
         '2:00' => 2, 
         '2:30' => 2.5, 
         '3:00' => 3 
        ) 
       )) 
... 

Và validator cutom của tôi để kiểm tra comisions qua để tìm thấy nếu người dùng vẫn có "tín dụng"

public function validate($comision, Constraint $constraint) 
{ 
$from = clone $comision->getDate(); 
$from->modify('first day of this month'); 

$to = clone $comision->getDate(); 
$to->modify('last day of this month'); 

$credit = $this->em->getRepository("ComisionsBundle:Comision")->comisionsByDate($comision,$from, $to); 

... 
+0

Tại sao bạn không thêm xác thực cho ngày? https://symfony.com/doc/current/reference/constraints/Date.html Hoặc có thể trong trình xác thực tùy chỉnh – kunicmarko20

+0

Tôi đã làm (tôi đang chỉnh sửa câu hỏi của mình để thêm nó) nhưng nó không có hiệu lực. Dường như nó chạy tất cả các quy tắc xác nhận ngay cả khi không có datetime hợp lệ sau khi chuyển đổi dữ liệu. –

Trả lời

4

Một cách để nhóm các ràng buộc của bạn như được mô tả trong các docs.

Bằng cách này bạn có thể xác định hai nhóm contraints trong khi nhóm thứ hai sẽ được xác nhận chỉ khi tất cả các ràng buộc trong nhóm đầu tiên là hợp lệ.

Về trường hợp sử dụng của bạn, bạn có thể đặt ràng buộc tùy chỉnh của mình vào một nhóm khác với nhóm mặc định để đảm bảo bạn có đối tượng DateTime chính xác $ comision.

+0

Một giải pháp tốt hơn rất nhiều so với tôi không biết về điều này. cảm ơn bạn! – kunicmarko20

2

To do this, you can use the GroupSequence feature. In this case, an object defines a group sequence, which determines the order groups should be validated.

https://symfony.com/doc/current/validation/sequence_provider.html

Các giải pháp sẽ trông như thế này:

/** 
* @MyValidation\TotalHours(groups={"Strict"}) 
* @Assert\GroupSequence({"Comision", "Strict"}) 
*/ 
class Comision 

Bằng cách này, đầu tiên nó sẽ xác nhận tất cả những hạn chế trong nhóm Comision (đó là giống như các nhóm Default). Chỉ khi tất cả các ràng buộc trong nhóm đó hợp lệ, nhóm thứ hai, Strict, sẽ được xác thực, đảm bảo $comision->getDate() sẽ có một phiên bản DateTime.

+0

Câu trả lời này khác với câu trả lời của tôi như thế nào? – Greg

+0

Tôi rất xin lỗi, tôi không đọc câu trả lời của bạn trước khi gửi. – yceruto

Các vấn đề liên quan