如何验证 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() 必须循环遍历这些。我真的卡住了,网上找不到一个例子。
我的表单请求 class 如下所示:
<?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;
}
这让我发疯了一整天!!
我的表单创建了用户。创建这些用户的管理员可以添加多行输入,然后在最后保存所有内容。我在 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() 必须循环遍历这些。我真的卡住了,网上找不到一个例子。
我的表单请求 class 如下所示:
<?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;
}