2014-11-14 26 views
5

FormRequests trong Laravel 5 là cách tiếp cận tốt để xác thực và ủy quyền. Nhưng cách tiến hành nếu tôi phải xác nhận yêu cầu có chứa dữ liệu từ một đến nhiều mối quan hệ. Ví dụ: nếu tôi có ứng dụng hóa đơn đơn giản. Một hóa đơn có nhiều dịch vụ. yêu cầu bài hình thức của tôi chứa dữ liệu này:Yêu cầu biểu mẫu Laravel 5 - xác nhận hợp lệ dữ liệu liên quan

array (size=5) 
    'date' => string '2014-11-14' (length=10) 
    'num' => string '175' (length=3) 
    'client_id' => string '5' (length=1) 
    'vat' => string '1' (length=1) 
    'services' => 
    array (size=2) 
     0 => 
     array (size=3) 
      'description' => string 'Service 1' (length=36) 
      'value' => string '10' (length=2) 
      'items' => string '2' (length=1) 
     1 => 
     array (size=3) 
      'description' => string 'Service 2' (length=11) 
      'value' => string '20' (length=2) 
      'items' => string '2' (length=1) 

Bây giờ trong lớp InvoiceFormRequest Tôi có thể xác nhận dữ liệu hóa đơn, nhưng làm thế nào để tiến hành dịch vụ:

<?php namespace App\Http\Requests; 

use Illuminate\Foundation\Http\FormRequest; 
use Response; 

class InvoiceFormRequest extends FormRequest 
{ 
    public function rules() 
    { 
     return [ 
      'date' => 'required', 
      'num' => 'required', 
      'client_id' => 'required', 
      'vat' => 'required' 
     ]; 
    } 

    public function authorize() 
    { 
     return true; 
    } 
} 

Cảm ơn trước!


Cập nhật: Như tôi đã đọc here trong Laravel 5.2 sẽ có thể viết một cái gì đó như thế này:

'services.*.description' => 'required', 
'services.*.value' => 'required:numeric', 
'services.*.items' => 'required:integer' 
+0

Bạn cần phải sử dụng một validator tùy chỉnh. Xem [this] (http://stackoverflow.com/a/26616023/397195) nếu bạn muốn trình xác thực tùy chỉnh bên trong 'FormRequest' của bạn. – Marwelln

+0

Bản cập nhật của bạn phải là câu trả lời. – whoan

+0

Vâng, tôi sẽ làm. Bây giờ nó là một thực tế. Laravel 5.2 vừa được phát hành. – fireball70

Trả lời

1

Bạn có thể sử dụng "mảng" lựa chọn cho các "dịch vụ" thông số trong các quy tắc, nhưng tất nhiên điều này sẽ không xác thực bất kỳ dữ liệu nào có trong mỗi phần tử.

http://laravel.com/docs/master/validation#rule-array

Vì vậy, tôi có thể khuyên bạn nên sử dụng một cái gì đó giống như Marwelln nói, với một validator tùy chỉnh, cũng như "mảng" quy tắc.

quy tắc của bạn có thể sẽ kết thúc trông như

public function rules() 
{ 
    return [ 
     'date' => 'required', 
     'num' => 'required', 
     'client_id' => 'required', 
     'vat' => 'required', 
     'services' => 'array|services' 
    ]; 
} 

và validator tùy chỉnh có thể là một cái gì đó này như thế này (bạn nên đặt điều này trong một ServiceProvider)

Validator::extend('services', function($attribute, $value, $parameters) 
{ 

    //foreach $value as $service 
      //validate $service['description'], $service['value'], $service['items'] 

    //return true or false depending on the validation of each element 
}); 

hy vọng nó giúp bạn tìm đúng hướng!

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