Php 如何清理laravel请求输入?

Php 如何清理laravel请求输入?,php,laravel,forms,request,sanitization,Php,Laravel,Forms,Request,Sanitization,我有MyRequest.php类扩展App\Http\Requests\Request。我想在验证之前对每个输入进行trim(),因为在验证之后带有空格的电子邮件无法通过验证 但是,sanitize()已从src/illumb/Foundation/Http/FormRequest.php中删除 创建一个抽象的SanitizedRequest类,该类扩展了通常的请求类 请求类应该扩展SanitizedRequest抽象类 您的SanitizedRequest类会像这样重写Request::all

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

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

  • 创建一个抽象的SanitizedRequest类,该类扩展了通常的请求类

  • 请求类应该扩展SanitizedRequest抽象类

  • 您的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的请求类

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

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

    PHP类似于将被注入到所用类中的函数。一个主要的区别是,一个特征不需要像一个扩展对象那样依赖。这意味着您可以将一个特性用于多个类,而不仅仅是一个类e.x。用于控制器、请求和任何您喜欢的内容

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


    如何利用一种特质来做到这一点 在
    \App\Traits\SanitizedRequest.php
    中创建一个trait作为文件。你可以在任何地方创建它,其实并不重要。您必须确保提供正确的命名空间

    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;
        }
    }
    

    在您的请求中,您可以将trait与
    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 []; }
    }
    

    如果有人在复制/粘贴这个答案时遇到问题,很可能是名称空间。trait方法提供了更大的灵活性。我建议阅读这两个答案来真正理解它。他们有点合得来。