laravel 使用用户函数验证

laravel validate with user function

blade.php

......
<tr>
  <td>{{ Form::label('cameraMac', 'Mac: ') }}</td>
  <td>{{ Form::text('cameraMac')}}</td>
</tr>
......

controller.php

$data = Input::all();
function transform($cameraMac) {
  return strtoupper($cameraMac);
}

//validation here

$user = User::find($data['user_id']);

if($data["cameraMac"])
{
    $user->camera_id = transform($data["cameraMac"]);
    Cloud_camera::create(['id' => transform($data["cameraMac"]), 'user_id' => $user->id]);
}

$user->save();

我需要将 cameraMac 转换为主键以存储在数据库中。如何在验证规则 'nullable|unique:cloud_cameras,id|size:6' 中使用函数 transform()。也就是说,在验证过程中如何调用这个函数。

您确定希望字段 cameraMac 可以作为(或多或少)主键为空吗?

您还应该使用 int 验证来使用 size 验证。
unique validation 的第三个参数是 except ,它将忽略给定的 ID。

您在控制器中的验证可能如下所示

$except_id = $request->input('cameraMac', null);

$this->validate($request, [
  'cameraMac' => 'nullable|unique:cloud_cameras,id,'.$except_id.'|int|size:6'
]);

One example如何在视图中显示验证错误

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

如果您需要以某种方式转换输入数据,您可以使用 merge 方法:

Input::merge(['cameraMac' => transform(Input::get('cameraMac')]);
$this->validate(Input::getFacadeRoot(), [
    'cameraMac' => 'nullable|unique:cloud_cameras,id|size:6'
]);

作为个人偏好,我会在控制器方法中输入提示 Illuminate\Http\Request $request,然后

$request->merge(['cameraMac' => transform($request->cameraMac)]);
$this->validate($request, ['cameraMac' => 'nullable|unique:cloud_cameras,id|size:6'
]);

现在我先传输输入数据,然后用下面的方式验证它。

但我正在寻找一种在验证中调用此函数的方法。

$data = Input::all();
$data['cameraMac'] = transform($data['cameraMac']);
$rules = array(
  'id' => 'required|unique:cloud_printers,id|size:6',
  'cameraMac' => 'unique:cloud_cameras,id|size:6',
);
$validator = Validator::make($data, $rules);
if ($validator->fails())
  return Redirect::back()->withInput()->withErrors($validator);

我会考虑 defining a middleware

中间件将执行转换并将结果合并回请求,然后再发送给控制器。

class TransformId {
    public function handle(Request $request, Closure $next) {
        // shout out to @alepeino
        $request->merge(['cameraMac' => transform($request->cameraMac)]);

        return $next($request);
    }
}

你可以定义一个custom validation rule:

Validator::extend('transformUpper', function ($attribute, $value, $parameters, $validator) {
   return strtoupper($value);
});

然后像往常一样在请求中使用新规则:

$this->validate($request, [
    'cameraMac' => 'required|transformUpper'
]);