如何清理 laravel 请求输入?
How can I sanitize laravel Request inputs?
我有 MyRequest.php
class 扩展 App\Http\Requests\Request
。我想在验证之前 trim()
每个输入,因为一封带有 space 的电子邮件未通过验证。
但是 sanitize()
已从 src/Illuminate/Foundation/Http/FormRequest.php
中删除
创建一个抽象的 SanitizedRequest class 扩展通常的 Request class。
YourRequest class 应该扩展你的 SanitizedRequest 摘要 class。
您的 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 []; }
}
我有 MyRequest.php
class 扩展 App\Http\Requests\Request
。我想在验证之前 trim()
每个输入,因为一封带有 space 的电子邮件未通过验证。
但是 sanitize()
已从 src/Illuminate/Foundation/Http/FormRequest.php
创建一个抽象的 SanitizedRequest class 扩展通常的 Request class。
YourRequest class 应该扩展你的 SanitizedRequest 摘要 class。
您的 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 []; }
}