【问题标题】:How can I sanitize laravel Request inputs?如何清理 laravel 请求输入?
【发布时间】:2016-04-21 13:50:22
【问题描述】:

我有 MyRequest.php 类扩展 App\Http\Requests\Request。我想在验证之前trim() 每个输入,因为在它之后带有空格的电子邮件没有通过验证。

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

【问题讨论】:

    标签: php laravel forms request sanitization


    【解决方案1】:
    1. 创建一个抽象的 SanitizedRequest 类来扩展通常的 Request 类。

    2. YourRequest 类应该扩展您的 SanitizedRequest 抽象类。

    3. 您的 SanitizedRequest 类会像这样覆盖 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 ContactRequest extends SanitizedRequest{
            public function authorize(){ return true; }
            public function rules(){ return []; }
        }
    

    【讨论】:

    • 如果有人在复制/粘贴此答案时遇到问题,很可能是命名空间。
    【解决方案2】:

    我刚遇到同样的问题。
    我想向您展示另一种不使用extends 而使用traits 的方法。 (我将学习 Tarek Adam 的示例课程)。

    PHP Traits 类似于将被注入到使用的类中的函数。一个主要区别是 Trait 不需要像 extends 那样的任何依赖项。这意味着您可以将特征用于不止一个类,例如用于控制器、请求和任何你喜欢的东西。

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


    如何使用 trait 来做到这一点

    \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 []; }
    }
    

    【讨论】:

    • 特征方法提供了更大的灵活性。我建议阅读两个答案以真正理解它。他们有点在一起。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2018-02-04
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多