只有在所有其他规则都通过时才添加验证规则,或者在 Laravel 5.7 中出现第一个错误时停止验证整个属性集
Adding validation rule only if all other rules pass, or stop validating entire set of attributes on the first error in Laravel 5.7
我想允许用户在本地存储磁盘上创建一个文件夹。所以发送到服务器的表单比较简单,只有三个属性:
- new-folder-name - 即要创建的文件夹的名称,
- relative-path - 相对于 asset 根目录的目录路径,在该目录中应创建新目录,以及
- asset_id - 资产的ID,我需要这个ID来获取资产的根目录。
问题是,当我验证这些属性时,我还需要检查用户要创建的文件夹是否已经存在。为此,我制定了一个名为 FolderExists
的规则。所以,在我 运行 FolderExists
之前,我必须确保所有其他规则都已成功通过,因为我的自定义规则应该接受 relative-path 和 asset_id 以便能够构建要检查的路径。
这是我的 rules()
函数,我正在自定义表单请求中进行验证:
public function rules()
{
return [
'asset_id' => ['bail', 'required', 'exists:assets,id'],
'relative-path' => ['bail', 'required', 'string'],
'new-folder-name' => ['bail', 'required', 'string', 'min:3', new FolderName, new FolderExists($this->input('asset_id'), $this->input('relative-path')]
];
}
所以我的问题是:
是否只有在所有其他验证规则都通过时才可以添加FolderExists
?
或者可能在验证器遇到第一个错误时停止整个验证?
这里两个选项都应该没问题。
谢谢!
我终于自己找到了解决办法。这是我最终得到的结果。
为了达到预期的结果,我在自定义表单请求的 withValidator()
方法中创建了另一个验证器,第二个验证器将仅处理 FolderExists
规则,并且仅当先前的验证失败时。
public function rules()
{
return [
'asset-id' => ['bail', 'required', 'integer', 'exists:assets,id'],
'relative-path' => ['bail', 'required', 'string'],
'new-folder-name' => ['bail', 'required', 'string', 'min:3', 'max:150', new FolderName]
];
}
public function withValidator($validator)
{
if (!$validator->fails())
{
$v = Validator::make($this->input(),[
'new-folder-name' => [new FolderExists($this->input('asset-id'), $this->input('relative-path'))]
]);
$v->validate();
}
}
如果我们的主要验证器通过,我们创建另一个验证器并仅传递 FolderExists
规则及其参数,这些参数已经过验证,并调用 validate()
方法。就是这样。
我想允许用户在本地存储磁盘上创建一个文件夹。所以发送到服务器的表单比较简单,只有三个属性:
- new-folder-name - 即要创建的文件夹的名称,
- relative-path - 相对于 asset 根目录的目录路径,在该目录中应创建新目录,以及
- asset_id - 资产的ID,我需要这个ID来获取资产的根目录。
问题是,当我验证这些属性时,我还需要检查用户要创建的文件夹是否已经存在。为此,我制定了一个名为 FolderExists
的规则。所以,在我 运行 FolderExists
之前,我必须确保所有其他规则都已成功通过,因为我的自定义规则应该接受 relative-path 和 asset_id 以便能够构建要检查的路径。
这是我的 rules()
函数,我正在自定义表单请求中进行验证:
public function rules()
{
return [
'asset_id' => ['bail', 'required', 'exists:assets,id'],
'relative-path' => ['bail', 'required', 'string'],
'new-folder-name' => ['bail', 'required', 'string', 'min:3', new FolderName, new FolderExists($this->input('asset_id'), $this->input('relative-path')]
];
}
所以我的问题是:
是否只有在所有其他验证规则都通过时才可以添加FolderExists
?
或者可能在验证器遇到第一个错误时停止整个验证?
这里两个选项都应该没问题。
谢谢!
我终于自己找到了解决办法。这是我最终得到的结果。
为了达到预期的结果,我在自定义表单请求的 withValidator()
方法中创建了另一个验证器,第二个验证器将仅处理 FolderExists
规则,并且仅当先前的验证失败时。
public function rules()
{
return [
'asset-id' => ['bail', 'required', 'integer', 'exists:assets,id'],
'relative-path' => ['bail', 'required', 'string'],
'new-folder-name' => ['bail', 'required', 'string', 'min:3', 'max:150', new FolderName]
];
}
public function withValidator($validator)
{
if (!$validator->fails())
{
$v = Validator::make($this->input(),[
'new-folder-name' => [new FolderExists($this->input('asset-id'), $this->input('relative-path'))]
]);
$v->validate();
}
}
如果我们的主要验证器通过,我们创建另一个验证器并仅传递 FolderExists
规则及其参数,这些参数已经过验证,并调用 validate()
方法。就是这样。