如何清理 laravel 请求输入?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

    创建一个抽象的 SanitizedRequest 类来扩展通常的 Request 类。

    YourRequest 类应该扩展您的 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 的 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 []; 

【讨论】:

特征方法提供了更大的灵活性。我建议阅读两个答案以真正理解它。他们有点在一起。

以上是关于如何清理 laravel 请求输入?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Blade 模板清理

如何根据输入请求规则在 laravel 刀片中显示错误消息

在 laravel 5 中的表单请求验证后传递旧输入

如何关闭Laravel的缓存

如何关闭Laravel的缓存

如何对 laravel 表单请求提出条件