在 Laravel 5.1 验证之前修改输入
Modify input before validation on Laravel 5.1
我正在尝试修改用户在验证成功之前提交的输入。我关注了 this easy instructions,但是当我在 Laravel 5.1 上测试它时,它不起作用。 我是不是做错了什么?
这是我在 SSHAM\Http\Requests\UserCreateRequest.php
上 class 的请求
<?php
namespace SSHAM\Http\Requests;
use SSHAM\Http\Requests\Request;
class UserCreateRequest extends Request
{
// Some stuff not related with this problem
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
// Only for debug
$prova = $this->all();
echo "<pre>Inside Request - Before sanitize\n[" . $prova['public_key'] . "]</pre>\n";
// Call a function to sanitize user input
$this->sanitize();
// Only for debug
$prova = $this->all();
echo "<pre>Inside Request - After sanitize\n[" . $prova['public_key'] . "]</pre>\n";
return [
'username' => 'required|max:255|unique:users',
'public_key' => 'openssh_key:public',
];
}
/**
* Sanitizes user input. In special 'public_key' to remove carriage returns
*/
public function sanitize()
{
$input = $this->all();
// Removes carriage returns from 'public_key' input
$input['public_key'] = str_replace(["\n", "\t", "\r"], '', $input['public_key']);
$this->replace($input);
}
}
这是我在 SSHAM\Providers\OpenSSHKeyValidatorServiceProvider.php
上的自定义验证规则
<?php
namespace SSHAM\Providers;
use Illuminate\Support\ServiceProvider;
class OpenSSHKeyValidatorServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
// Registering the validator extension with the validator factory
\Validator::extend('openssh_key', function ($attribute, $value, $parameters) {
// Some stuff not related with this problem
// Only for debug
echo "<pre>Inside Validator value\n[" . $value ."]</pre>\n";
dd();
return true;
});
}
// Some stuff not related with this problem
}
当我调用调试时,我得到了这个输出:
Inside Request - Before sanitize
[blah
second line
third line]
Inside Request - After sanitize
[blah second line third line]
Inside Validator value
[blah
second line
third line]
似乎 sanitize()
正在工作,但是当值在验证时被处理 class 它没有被清理。
这是一个棘手的问题。我只想出了一种方法来实现你想要的。
要点是,如果您更改 rules() 函数中的请求值,它对验证器没有影响。
您可以通过向 UserCreateRequest 添加函数来解决此问题:
protected function getValidatorInstance() {
$this->sanitize();
return parent::getValidatorInstance();
}
这会覆盖父级的 getValidatorInstance();
父级的 getValidatorInstance() 方法包括
return $factory->make(
$this->all(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes());
在您的 rules() 函数中的代码之前到达,因此使用 $this->all() 的旧值(不受 rules() 中更改的影响)。
如果您在自己的 RequestClass 中重写该函数,您可以在调用实际父类的方法之前操纵 Request 值。
更新 (L5.5)
如果您使用控制器验证功能,您可以这样做:
$requestData = $request->all();
// modify somehow
$requestData['firstname'] = trim($requestData['firstname']);
$request->replace($requestData);
$values = $this->validate($request, $rules);
如果您使用请求 MyClassRequest
来保持验证,那么只需重写 Request
class
的 all() 方法
public function all()
{
$attributes = parent::all();
//you can modify your inputs here before it is validated
$attribute['firstname'] = trim($attribute['firstname']);
$attribute['lastname'] = trim($attribute['lastname']);
return $attributes;
}
希望对您有所帮助。
您可以通过修改请求和设置输入值来实现。
$request->request->set('key', 'value');
或者,如果您更喜欢 request
辅助方法。
request()->request->set('key', 'value');
这些答案在 5.5 中不再适用于我
你可以使用
protected function validationData()
{
$this->request->add([
'SomeField' => '..some code to modify it goes here'
]);
return $this->request->all();
}
根据请求添加方法会覆盖该键的任何现有输入。
如果您遵循线索
,您会明白为什么这在 Illuminate\Foundation\Http\FormRequest 中有效
/**
* Get data to be validated from the request.
*
* @return array
*/
protected function validationData()
{
return $this->all();
}
您可以使用 prepareForValidation 方法
protected function prepareForValidation()
{
$this->merge(['field' => 'field value' ]) ;
}
我正在尝试修改用户在验证成功之前提交的输入。我关注了 this easy instructions,但是当我在 Laravel 5.1 上测试它时,它不起作用。 我是不是做错了什么?
这是我在 SSHAM\Http\Requests\UserCreateRequest.php
<?php
namespace SSHAM\Http\Requests;
use SSHAM\Http\Requests\Request;
class UserCreateRequest extends Request
{
// Some stuff not related with this problem
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
// Only for debug
$prova = $this->all();
echo "<pre>Inside Request - Before sanitize\n[" . $prova['public_key'] . "]</pre>\n";
// Call a function to sanitize user input
$this->sanitize();
// Only for debug
$prova = $this->all();
echo "<pre>Inside Request - After sanitize\n[" . $prova['public_key'] . "]</pre>\n";
return [
'username' => 'required|max:255|unique:users',
'public_key' => 'openssh_key:public',
];
}
/**
* Sanitizes user input. In special 'public_key' to remove carriage returns
*/
public function sanitize()
{
$input = $this->all();
// Removes carriage returns from 'public_key' input
$input['public_key'] = str_replace(["\n", "\t", "\r"], '', $input['public_key']);
$this->replace($input);
}
}
这是我在 SSHAM\Providers\OpenSSHKeyValidatorServiceProvider.php
<?php
namespace SSHAM\Providers;
use Illuminate\Support\ServiceProvider;
class OpenSSHKeyValidatorServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
// Registering the validator extension with the validator factory
\Validator::extend('openssh_key', function ($attribute, $value, $parameters) {
// Some stuff not related with this problem
// Only for debug
echo "<pre>Inside Validator value\n[" . $value ."]</pre>\n";
dd();
return true;
});
}
// Some stuff not related with this problem
}
当我调用调试时,我得到了这个输出:
Inside Request - Before sanitize
[blah
second line
third line]
Inside Request - After sanitize
[blah second line third line]
Inside Validator value
[blah
second line
third line]
似乎 sanitize()
正在工作,但是当值在验证时被处理 class 它没有被清理。
这是一个棘手的问题。我只想出了一种方法来实现你想要的。
要点是,如果您更改 rules() 函数中的请求值,它对验证器没有影响。
您可以通过向 UserCreateRequest 添加函数来解决此问题:
protected function getValidatorInstance() {
$this->sanitize();
return parent::getValidatorInstance();
}
这会覆盖父级的 getValidatorInstance();
父级的 getValidatorInstance() 方法包括
return $factory->make(
$this->all(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes());
在您的 rules() 函数中的代码之前到达,因此使用 $this->all() 的旧值(不受 rules() 中更改的影响)。
如果您在自己的 RequestClass 中重写该函数,您可以在调用实际父类的方法之前操纵 Request 值。
更新 (L5.5)
如果您使用控制器验证功能,您可以这样做:
$requestData = $request->all();
// modify somehow
$requestData['firstname'] = trim($requestData['firstname']);
$request->replace($requestData);
$values = $this->validate($request, $rules);
如果您使用请求 MyClassRequest
来保持验证,那么只需重写 Request
class
public function all()
{
$attributes = parent::all();
//you can modify your inputs here before it is validated
$attribute['firstname'] = trim($attribute['firstname']);
$attribute['lastname'] = trim($attribute['lastname']);
return $attributes;
}
希望对您有所帮助。
您可以通过修改请求和设置输入值来实现。
$request->request->set('key', 'value');
或者,如果您更喜欢 request
辅助方法。
request()->request->set('key', 'value');
这些答案在 5.5 中不再适用于我
你可以使用
protected function validationData()
{
$this->request->add([
'SomeField' => '..some code to modify it goes here'
]);
return $this->request->all();
}
根据请求添加方法会覆盖该键的任何现有输入。
如果您遵循线索
,您会明白为什么这在 Illuminate\Foundation\Http\FormRequest 中有效/**
* Get data to be validated from the request.
*
* @return array
*/
protected function validationData()
{
return $this->all();
}
您可以使用 prepareForValidation 方法
protected function prepareForValidation()
{
$this->merge(['field' => 'field value' ]) ;
}