Php laravel控制器中的微调输入

Php laravel控制器中的微调输入,php,laravel,Php,Laravel,我的应用程序由于字符串被存储在数据库中而出错,中间有两个空格,没有被适当修剪。 在我的控制器中,我使用了laravel的验证器,我相信它使用了trimStrings中间件来处理修剪输入,但是我的代码仍然在数据库中存储带有双空格的字符串 以下是我的控制器代码: public function update(Request $request, $id) { $room = Room::find($request->roomid); $data = $this->vali

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

在我的控制器中,我使用了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;
}

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


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

< P> <代码> TrimStry中间件从字符串的开始或结束修剪空间,而不是在中间。以下是一个帮助器,您可以创建并使用它从字符串中的任何位置修剪额外的空格:

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

正如下面的注释所建议的那样,为了在没有额外空间的情况下存储它,您可以对列创建一个变体,因此在您的模型中,放置以下内容:

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

<代码> TrimStrys/Cudio>中间件从字符串的开始或结束修剪空间,而不是在中间。以下是一个帮助器,您可以创建并使用它从字符串中的任何位置修剪额外的空格:

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

正如下面的注释所建议的那样,为了在没有额外空间的情况下存储它,您可以对列创建一个变体,因此在您的模型中,放置以下内容:

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

正如@nakov的回答中所提到的,这是因为
TrimStrings
只使用php函数,该函数将从字符串的开头和结尾去除空白

如果希望
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));
}

正如@nakov的回答中所提到的,这是因为
TrimStrings
只使用php函数,该函数将从字符串的开头和结尾去除空白

如果希望
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));
}

您可以将其添加为您特别需要的属性的集合变量。@gingaWRATH我遇到的问题是,在我的刀片文件中使用{{room->name}}时,这似乎会删除两个白色间距,因此,当在我的雄辩查询中使用该值时,它与数据库中存储的值不匹配Yes@StevenBendell这是GingaWRATH建议的,所以现在看看我的编辑。您可以将其添加为您特别需要的属性的集变量。@GingaWRATH我遇到的问题是,当使用{room->name}在我的blade文件中,这似乎删除了双白间距,因此当在我的雄辩查询中使用该值时,它与数据库中存储的内容不匹配Yes@StevenBendell这是GingaWRATH建议的,所以现在看看我的编辑。我遇到的问题是,当使用{{room->name}在我的blade文件中,这似乎删除了双白间距,因此当在我的雄辩查询中使用该值时,它与数据库中存储的内容不匹配我遇到的问题是,在我的blade文件中使用{room->name}时,这似乎删除了双白间距,因此,当我在雄辩的查询中使用该值时,它与数据库中存储的内容不匹配