如何清理laravel 5.X请求输入?

Tar*_*dam 6 php forms sanitization request laravel-5

我有MyRequest.php课程延期App\Http\Requests\Request.我希望trim()在验证之前输入每个输入,因为在它之后带有空格的电子邮件不会通过验证.

但是sanitize()被删除了src/Illuminate/Foundation/Http/FormRequest.php

Tar*_*dam 6

  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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

    class ContactRequest extends SanitizedRequest{
        public function authorize(){ return true; }
        public function rules(){ return []; }
    }
Run Code Online (Sandbox Code Playgroud)


Gki*_*kan 6

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

PHP Traits就像将被注入到所使用的类中的函数。一个主要区别是 Trait 不需要像扩展那样的任何依赖项。这意味着您可以将特征用于多个控制器、请求和任何您喜欢的类。

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


如何用特质来做

创建一个特征作为\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;
    }
}
Run Code Online (Sandbox Code Playgroud)


在您的请求中,您可以使用带有关键字的特征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 []; }
}
Run Code Online (Sandbox Code Playgroud)