如何验证laravel 5中的克隆表单元素


How to validate cloned form elements in laravel 5

这一整天都让我抓狂!!

我的表单创建用户。创建这些用户的管理员可以添加几行输入,然后在最后保存所有内容。我在jQuery中使用clone()方法,我已经对所需的输入等进行了客户端验证。我有一个非常强大的域层,但现在我需要服务器端验证,这样Laravel就可以检查电子邮件是否已经存在,因为它必须是唯一的。我对Laravel非常精通,但对于新的FormRequest对象,我一直纠结于如何循环通过每个输入等,因为FormRequestObject似乎只接受一个条目。这一切都在ajax中。。。

我的表单数据如下:

counter:2
_token:KwGAUheSXbzkInh1RZ4RPenx4Fd4fF5DsPm5bjyO
firstname_1:name1
lastname_1:last1
email_1:email@email.com
password_1:keith
firstname_2:name2
lastname_2:last2
email_2:email@email.com
password_2:keith

尽可能地,输入名称具有递增的id,因此表单请求中的rules()必须循环通过这些名称。我真的很困,在网上找不到一个例子。

我的表单重用类如下所示:

<?php namespace hidden'Http'Controllers'UserAccess'Requests;
use hidden'Http'Requests'Request;
use Illuminate'Auth'Guard;
use hidden'Domain'Services'UserAccess'GetUserFromEmailService;
class CreateAdministratorRequest extends Request {

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'firstname'     =>  'required',
            'lastname'      =>  'required',
            'email'         =>  'required|email|unique:users,email',
            'password'      =>  'required'
        ];
    }
}

到目前为止,我的控制器方法(它最终会循环通过输入并发出命令,但目前毫无意义):

/**
     * @param CreateAdministratorRequest $request
     */
    public function createAdministrators(CreateAdministratorRequest $request)
    {
        // dispatch command per entry
    }

如果您想尽可能地保留您的结构,可以执行以下操作。

public function rules()
{
    $counter = $this->get('counter');
    $emails= [];
    //  validate manually if every submitted email is unique
    // so, we need every email value
    for ($i = 1; $i <= $counter; $i++){
        $emails[] = $this->get('email_' . $i);
    }
    // Now, validate if every email between them are unique
    // array_unique() delete repeated values, so we compare
    // the size before and after filter the values
    $unique = (count($emails) === count(array_unique($emails)));
    if (! $unique){
         return redirect()->back()
             ->withMessage('Sorry, all emails should be different');
    }
    // Now, you need to add every field into the rules
    $rules = [];
    for ($i = 1; $i <= $counter; $i++){
        $rules['email_' . $i] = 'required|email|unique:users,email';
        $rules['lastname_' . $i] = 'required';
        $rules['firstname_' . $i] = 'required';
        $rules['password_' . $i] = 'required';
    }

    return $rules;
}