整理Laravel控制器中的输入

时间:2019-05-03 14:42:15

标签: php laravel

我的应用程序由于存储在数据库中的字符串而出现错误,这些字符串的中间有两个空格并且没有适当地修剪。

在我的控制器中,我使用了laravel的验证程序,我相信该验证程序使用trimStrings中间件来处理输入的内容,但是我的代码仍在数据库中存储带双倍空格的字符串。

这是我的控制器代码:

public function update(Request $request, $id)
{
    $room = Room::find($request->roomid);

    $data = $this->validate($request, [
        'name' =>'required|string',
        'volume' => 'required',
        'newrefurb'=> 'required'
    ]);

    $updateroom = $room->updateRoom($data);
}

这是我的模型代码:

public function updateRoom($data)
{
    $this->name = $data['name'];
    $this->volume = $data['volume'];
    $this->newrefurb = $data['newrefurb'];

    $this->save();

    return $this->id;
}

在这里,名称字段是字符串中间包含双空格的问题。

处理双倍间距字符串的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

TrimStrings中间件从字符串的开头或结尾(而不是中间)修剪空格。您可以在这里创建一个帮助程序,并使用它来修剪字符串中任何地方的多余空格:

function trimExtraSpaces($text)
{
    return preg_replace('/\s+/', ' ', $text);
}

-编辑

如下面的注释中所建议的那样,为了存储它而没有多余的空间,您可以对列进行更改,因此在模型中,请输入以下内容:

public function setNameAttribute($value)
{
    $this->attributes['name'] = trimExtraSpaces($value);
}

答案 1 :(得分:0)

如@nakov的答案中所述,这是因为TrimStrings仅使用php的trim()函数,该函数只会从字符串的开头和结尾去除空格。

如果您希望TrimStrings中间件也用单个空格替换所有双精度空格,则可以向TrimStrings中间件添加以下方法:

/**
 * Transform the given value.
 *
 * @param  string  $key
 * @param  mixed  $value
 * @return mixed
 */
protected function transform($key, $value)
{
    if (in_array($key, $this->except, true) || !is_string($value)) {
        return $value;
    }

    return  trim(str_replace('  ', ' ', $value));
}