2017-04-01 116 views
1

我想清理我的应用程序的用户输入以下this articleLaravel 5消毒必填字段行为

下面是我的要求

class TestRequest extends Request 
{ 

    public function authorize() 
    { 
     return true; 
    } 

    public function rules() 
    { 
     $this->sanitize(); 

     return [ 
      'title'=>'required|max:100' 

     ]; 
    } 

    public function sanitize() 
    { 

     $input = $this->all(); 
     if(!empty($input)) 
     { 
     $input['title'] = trim(strip_tags($input['title'])); 
     $this->replace($input); 

     } 

    } 
} 

艰难的标题是必填字段,如果我试图把<h1></h1>作为标题字段中的输入,根据sanitize()函数中的逻辑,标签被剥离,但空字符串被保存在数据库中。规则中所需的字段验证不起任何作用。

如何处理?

更新:

下面是用于保存请求的控制器方法。

public function save(TestRequest $request) 
{ 
    $input = $request->all(); 
    ... 
} 
+0

请显示相关的控制器方法。 –

+0

@AlexeyMezenin控制器方法添加.. – ZedBee

回答

1

第一个选项是在你的代码中使用合并(),而不是代替(),即:

$this->merge(['title' => trim(strip_tags($input['title']))]); 

第二个选项是覆盖所有的()函数,即:

public function all() 
{ 
    $input = parent::all(); 
    if(!empty($input)) 
    { 
     $input['title'] = trim(strip_tags($input['title'])); 
    } 
    return $input; 
} 

在上一个代码示例中,您不必使用sanitize()函数。

+0

合并选项不起作用。第二个选项工作。请您详细说明如何处理清洁输入的情况下选项一,两个不与清洁方法(选项3)一起使用? – ZedBee

+0

我在过去使用过一个选项,我不记得确切的Laravel版本。现在,在Laravel 5.4中,我通常会重写validationData()以公开它,但这是另一个长长的故事。在laravel到现在还没有一个可接受的卫生处理方法(它是一个有争议的主题)。所以直到你知道你在做什么(重写all()函数并不是那么明智的),它没有问题。 – dparoli

+0

为了完整起见,有两个转换输入的中间件,但它们不是每个请求都是全局的。 \ App \ Http \ Middleware \ TrimStrings和\ Illuminate \ Foundation \ Http \ Middleware \ ConvertEmptyStringsToNull – dparoli