Laravel 5 验证修剪

8

我是Laravel 5的初学者。

我该如何在验证器中去除空白?我已经阅读了文档,但没有针对修剪(去除空格)的验证器。

这是我的规则:

$rules = [
        'name' =>'required',
        'email' => 'required|email',
        'address' => 'required',
        'phones' => 'required'
    ];

谢谢您的回答。
8个回答

11
您可以使用以下代码来修剪所有字符串输入(因为您可能会在输入中有数组)
    // trim all input
    Input::merge(array_map(function ($value) {
        if (is_string($value)) {
            return trim($value);
        } else {
            return $value;
        }
    }, Input::all()));

你可以使用三元运算符来简化代码: return is_string($value) ? trim($value) : $value; 顺便说一下,这个答案应该被选择。 - user6458222

9
“验证器的工作不是更改任何输入数据。CodeIgniter 中存在 Trim 验证器,但对我来说,这不是执行修剪操作的正确位置。

您可以使用以下方式自动修剪所有输入:


Input::merge(array_map('trim', Input::all()));

现在完成你剩下的编码:
$username = Input::get('username'); // it's trimed 
// ...
Validator::make(...);

1
这不支持数组。@Alex的答案更好。 - kjdion84
你应该这样做,但这不是当前使用中间件的方式。 - Farshad Fahimi

5

由于文档Laravel HTTP Request, 默认情况下laravel会修整所有请求数据。


在验证部分使用Trim的方式非常麻烦。 你可以通过中间件来管理此功能,如trim将空字符串转换为null

因为中间件在验证之前执行,所以您可以在验证时获得干净的数据。


3
在Laravel 5.2或5.3中,您可以使用trim来移除空格,如下所示: $input = array_map('trim', $request->all()); 这将从已发布的输入中删除所有空格,并且验证将正常工作。

2
最初的回答:你可以在请求文件中使用这个。
$input = request()->all();
$input['url'] = trim($input['url']);
request()->replace($input);

你可以在请求文件中创建一个all()函数来更新请求参数:

您还可以在请求文件中创建一个all()函数来更新请求参数:

 public function all()
    {
        $all = parent::all(); // $this->all();
        $all['new_key'] = "new_data";
        $all['old_key'] = "new_data";

        return $all;
    }

1
public function formatInput()
{
  $input = array_map('trim', $this->all());
  $this->replace($input);
  return $this->all();
}

0
$data = $r->all();
foreach ($data as $key => $value) {
if($value!=""){ //If your primaryKey id is autoincrement
   $data[$key] = preg_replace('/\s{2,}/',' ',$value);
}
}
$variable = new modelName($data);
$variable->save();

//Here Parameter Explaination
 => '/\s{2,}/' Pattern must write between '/ /' and \s{2,} means 2 or more than 2 spaces sholud be trim
 => ' ' second parameter is with. Means 1st parameter replace with 2nd parameter(here, one space)
 => $value is variable which is trim

0

我扩展了FormRequest类并重写了prepareForValidation方法,该方法在验证之前被调用。

// anything I don't want trimmed here
protected $untrimmable = [];

// replace the request with trimmed request here
protected function prepareForValidation()
{
    return $this->replace($this->trimData($this->all()));
}

// recursively trim the fields in the request here
protected function trimData($data,$keyPrefix = '')
{
    $trimmedFields = array_map(function($value,$field) use ($keyPrefix){
        // if the value is an array handle it as
        // a request array and send along the prefix
        if(is_array($value)){
            return $this->trimData($value,$this->dotIndex($keyPrefix,$field));
        }

        // if the field is not in the specified fields to be
        // left untrimmed
        if(
            !in_array($this->dotIndex($keyPrefix,$field),$this->dontTrim) && 
            !in_array($this->dotIndex($keyPrefix,$field), $this->untrimmable)
        ) {
            return trim((string) $value);
        }

        return $value;

    }, $data,array_keys($data));

    return array_combine(array_keys($data),$trimmedFields);
}

功能:

  1. 用修剪过的输入替换请求
  2. 将所有不想修剪的字段设置为untrimmable属性。
  3. 处理带有点符号.的嵌套输入。

这里是一个链接到要点的链接https://gist.github.com/msbrime/336a788c7cced2137bdc7896c1241239


你好,能否请您不要仅提供源链接,而是在您的答案中突出有用的部分。另外,我已经编辑了您的答案,请尽量格式化您的答案,特别是代码部分。 - Arount
当然没问题 @Arount - msbrime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接