我正在用两个不同的维度规则来验证一个图像文件,它可以是b图标或横幅,这取决于最近选择的字段的选择。我是通过添加一个自定义规则类来做到这一点的,下面是我的验证规则,它只适用于图标或横幅。
$validator = Validator::make([
'file' => $value,
], [
'file' => 'mimes:png,webp|dimensions:width=512,height=512|max:2048'
]);
$validator->validate();
现在的问题是验证横幅在同一字段中具有不同的维度。有没有办法在这条线上再加一个宽度和高度?我尝试在这个文件中添加一个同名的规则,但是它不起作用。还是有其他方法来解决这个问题呢?我看过文档,但没有找到解决方案。
提前谢谢。
发布于 2022-08-30 00:02:12
默认情况下,验证规则必须通过输入才能有效。在您的情况下,您需要通过这两条规则中的一条,这通过内置的验证规则是不可能的。您可以创建自己的验证规则,例如:
php artisan make:rule DimensionRule
然后修改生成的规则:
class DimensionRule implements Rule {
public function passes($attribute, $value) {
$validator1 = Validator::make([ $attribute => $value ], [ $attribute => 'dimensions:width=512,height=512' ]);
if ($validator1->passes()) {
return true;
}
$validator2 = Validator::make([ $attribute => $value ], [ $attribute => 'dimensions:width=800,height=30' ]);
return $validator2->passes();
}
public function message()
{
return 'Dimensions must either be 512x512 or 800x30';
}
}
然后您可以使用以下规则:
$validator = Validator::make([
'file' => $value,
], [
'file' => [ 'mimes:png,webp', new DimensionRule(), 'max:2048' ]
]);
$validator->validate();
发布于 2022-08-29 22:45:21
我会这样做,购买连续运行几个验证,如果它通过一个,它应该是可以的。在此之后,您可以编写更多的验证规则,当然,我认为只有维度验证才应该在这里。
class FileUploadController extends Controller
{
/**
* Update the avatar for the user.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function fileUpload(Request $request)
{
foreach ([[100, 50], [200, 150]] as $k => $dim) {
$validators[$k] = Validator::make($request->all(), [
'avatar' => "dimensions:width={$dim[0]},height={$dim[1]}"
]);
}
foreach ($validators as $validator) {
if ($validator->fails()) {
$invalid = true;
} else {
$invalid = false;
break;
}
}
if ($invalid) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
$path = Storage::putFile('public', $request->file('avatar'));
return $path;
}
}
这里还有一个特性测试:
class FileUploadTest extends TestCase
{
/**
* @dataProvider cases
*/
public function test_avatars_can_be_uploaded($w, $h, $shoudReturnError)
{
Storage::fake('public');
$file = UploadedFile::fake()->image('av1.jpg', $w, $h);
$response = $this->post('/file-upload', [
'avatar' => $file,
]);
if ($shoudReturnError) {
// The image dimensions are not right and it should return error
$response->assertSessionHasErrors(['avatar']);
} else {
// The image dimensions are fine and it should pass
Storage::assertExists('public/' . $file->hashName());
}
}
public function cases()
{
return [
[100, 50, $shoudReturnError = false],
[600, 850, $shoudReturnError = true],
[200, 150, $shoudReturnError = false],
[102, 50, $shoudReturnError = true],
];
}
}
我提供了验证应该通过和应该失败的情况。
干杯
https://stackoverflow.com/questions/73537437
复制相似问题