如何清理 laravel 请求输入?

How can I sanitize laravel Request inputs?

我有 MyRequest.php class 扩展 App\Http\Requests\Request。我想在验证之前 trim() 每个输入,因为一封带有 space 的电子邮件未通过验证。

但是 sanitize() 已从 src/Illuminate/Foundation/Http/FormRequest.php

中删除
  1. 创建一个抽象的 SanitizedRequest class 扩展通常的 Request class。

  2. YourRequest class 应该扩展你的 SanitizedRequest 摘要 class。

  3. 您的 SanitizedRequest class 覆盖 Request::all() 就像这样...

    namespace App\Http\Requests\Forms;
    use App\Http\Requests\Request;
    
    abstract class SanitizedRequest extends Request{
    
        private $clean = false;
    
        public function all(){
            return $this->sanitize(parent::all());
        }
    
    
        protected function sanitize(Array $inputs){
            if($this->clean){ return $inputs; }
    
            foreach($inputs as $i => $item){
                $inputs[$i] = trim($item);
            }
    
            $this->replace($inputs);
            $this->clean = true;
            return $inputs;
        }
    }
    

然后是一个普通的 CustomRequest,但是扩展了 SanitizedRequest 而不是 laravel 的 Request class

    class ContactRequest extends SanitizedRequest{
        public function authorize(){ return true; }
        public function rules(){ return []; }
    }

我刚遇到同样的问题。
我想向您展示另一种不使用 extends 但使用 traits 的方法。 (我将采用 Tarek Adam 的示例 类)。

PHP Traits 就像将被注入到使用过的 class 中的函数。一个主要区别是 Trait 不需要像 extends 那样的任何依赖。这意味着您可以将一个特征用于多个 class e.x。对于控制器、请求和任何你喜欢的东西。

Laravel在BaseController中提供了一些traits,我们也可以这样做。


如何使用特质

\App\Traits\SanitizedRequest.php 中创建特征作为文件。您可以在任何地方创建它,这并不重要。您必须确保提供正确的命名空间。

namespace App\Trait;

trait SanitizedRequest{

    private $clean = false;

    public function all(){
        return $this->sanitize(parent::all());
    }


    protected function sanitize(Array $inputs){
        if($this->clean){ return $inputs; }

        foreach($inputs as $i => $item){
            $inputs[$i] = trim($item);
        }

        $this->replace($inputs);
        $this->clean = true;
        return $inputs;
    }
}


在您的请求中,您可以将特征与 use SanitizedRequest 关键字一起使用。

namespace App\Http\Requests\Forms;

use App\Http\Requests\Request;
use App\Trait\SanitizedRequest; // Import the Trait 

class ContactRequest extends Request {
    use SanitizedRequest; // This line adds all the Trait functions to your current class

    public function authorize(){ return true; }
    public function rules(){ return []; }
}