【发布时间】:2018-09-08 13:36:43
【问题描述】:
我正在尝试在 lumen 中实现自定义验证规则,并且我正在关注 lumen 5.6 的文档。它说要参考 laravel 验证以了解如何使用验证。我目前正在尝试进行验证以检查该值是否为真空值。所以 $x === "" 意味着它失败了这是我创建的位于 App\Rules 文件夹中的规则。
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class TrueNull implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
if($value === "") {
return false;
} else {
return true;
}
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute cannot be an empty string.';
}
}
我直接从 lumen 文档中复制了这个,并对 pass 函数进行了修改。在我的模态中有
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Model;
use Laravel\Lumen\Auth\Authorizable;
use App\Rules\TrueNull;
use Validator;
然后
public function validate($data)
{
// make a new validator object
$v = Validator::make($data,
[
'x' => ['regex:/^(?=.+)(?:[1-9]\d*|0)?(?:\.\d+)?$/', new TrueNull]
]
}
但是 TrueNull 的验证永远不会发生,我错过了一个连接还是真的令人沮丧,因为文档说这应该可以工作。 这是我的控制器调用我正在验证的更新。
public function update(Request $request, $id)
{
/*
In middleware need to add community id to request.
*/
try {
$site = Site::findOrFail($id);
if ($site->validate($request->all())) {
$site->fill($request->all());
// save
$site->save();
} else {
return response()->json($site->errors(), 422);
}
} catch (Exception $e) {
return response()->json($e, 422);
}
return response()->json($site, 200);
}
【问题讨论】:
-
也许添加 Laravel 中可用的
ConvertEmptyStringsToNull中间件 (see here) 是一种解决方案?这不仅可以让您删除额外的验证,而且从可用性的角度来看也可以派上用场。 -
我不想在我的 api 中执行任何数据操作。我想拒绝发送“”而不是空的任何非字符串字段。我想强制我们的前端发送正确的数据,而不是仅仅假设因为“”在我的工作中意味着不同的东西。
-
好的,然后回到你的问题。我不完全确定 lumen 中的验证器如何处理多个验证规则(即首次错误失败或全部评估),但在我看来,您的正则表达式已经排除了空字符串。所以也许如果你颠倒数组中验证规则的顺序,你可以让它因为另一个规则的空字符串而失败?
-
我也有同样的想法,我删除了正则表达式,只是保留了验证规则,但它仍然没有评估“”。如果请求有键但属性是“”,它似乎在流明中很奇怪,它只是跳过所有内容。
标签: php laravel validation lumen