2014-12-02 22 views
20

tôi có thể xác định một quy tắc cho một số nguyên duy nhất như thế này:Yii2: quy tắc xác thực cho mảng?

[['x'], 'integer'] 

Có thể nói rằng x là một mảng số nguyên? Ví dụ:

[['x'], 'integer[]'] 

Và tôi có thể chỉ định giá trị hợp lệ trong mảng không?

Cập nhật: Từ phiên bản Yii 2.0.4, chúng tôi có một số trợ giúp. Xem this answer.

+0

Đây có phải là cho các quy tắc mô hình? Bạn có thể không thực sự lưu trữ một mảng, có thể một serialization của nó. Bạn có muốn làm cho mình rõ hơn một chút không? – casraf

+0

Trong trường hợp của tôi, nó là mô hình cho một biểu mẫu có chứa một số hộp kiểm được tải dưới dạng mảng (với $ modal-> tải (Yii :: $ app-> request-> post()). Vì vậy, nó không dành cho ActiveRecord – robsch

+0

@Chen Asraf Bạn có thể lưu trữ một mảng nếu bạn sử dụng ** mongodb ** – verybadbug

Trả lời

42

Từ phiên bản 2.0.4 có mới EachValidator mà làm cho nó dễ dàng hơn bây giờ :

['x', 'each', 'rule' => ['integer']], 

Điều này là đủ. Nếu các giá trị cũng nên được kiểm tra bạn có thể sử dụng này (với 'in' validator thực chất là một RangeValidator):

['x', 'each', 'rule' => ['in', 'range' => [2, 4, 6, 8]]], // each value in x can only be 2, 4, 6 or 8 

Tuy nhiên, bạn có thể sử dụng 'trong' validator cũng trực tiếp. Và đó là có thể với các phiên bản trước Yii 2.0.4:

['x', 'in', 'range' => [2, 4, 6, 8], 'allowArray' => true] 

Việc sử dụng 'strict' => true lẽ sẽ chẳng có ý nghĩa trong trường hợp các dữ liệu được gửi bởi khách hàng và được thiết lập với Model->load(). Tôi không hoàn toàn chắc chắn nhưng tôi nghĩ rằng những giá trị đó đều được gửi dưới dạng chuỗi (như "5" thay vì 5).

+0

['x', 'mỗi', 'quy tắc' => ['trong', 'phạm vi' => [2, 4, 6, 8]]] sẽ không hoạt động nếu x là một mảng ints (không phải là vô hướng kiểu). Nó nên được thực hiện như bạn mô tả dưới đây ['x', 'mỗi', 'quy tắc' => ['trong', 'allowArray' => true, 'range' => [2, 4, 6, 8]]] . Tôi đã dành thời gian trong khi tôi xác định chính xác tôi đang làm gì sai. Tuy nhiên, nhờ câu trả lời của bạn – Ekonoval

+1

['x', 'mỗi', 'quy tắc' => ['số nguyên']] Tôi đang sử dụng dòng chính xác này trong SearchModel nhưng nó không hoạt động ... Dường như bỏ qua quy tắc ... Tại sao? – webpaul

+0

@webpaul Khó nói. Tạo một câu hỏi mới với thông tin chi tiết. – robsch

13

Bạn có thể cần phải tạo ra quy tắc xác nhận tùy chỉnh như dưới đây:

['x','checkIsArray'] 

Sau đó, trong mô hình của bạn, impelement checkIsArray:

public function checkIsArray(){ 
    if(!is_array($this->x)){ 
     $this->addError('x','X is not array!'); 
    } 
} 

Bạn có thể làm tất cả các bạn cần vào một quy tắc xác nhận tùy chỉnh.


Như EMTE nêu trên nhận xét, bạn cũng có thể sử dụng validator inline với chức năng ẩn danh như dưới đây:

['x',function ($attribute, $params) { 
    if(!is_array($this->x)){ 
     $this->addError('x','X is not array!'); 
    } 
}] 
+0

Điều này nghe có vẻ hợp lý! – robsch

+3

nếu bạn không muốn chỉ định chức năng mới, bạn có thể sử dụng chức năng ẩn danh trực tiếp trong quy tắc – emte

+0

@emte Có, bạn nói đúng. Cảm ơn bạn. –

3

Nếu bạn cần phải kiểm tra đối với phạm vi cụ thể cho từng phần tử mảng

['x', 'required'] 

cộng

['x', 'each', 'rule' => ['in', 'allowArray' => true, 'range' => [2, 4, 6, 8]]] 

hoặc

['x', 'in', 'allowArray' => true, 'range' => [2, 4, 6, 8] ] 
Các vấn đề liên quan