Измените ввод перед проверкой на Laravel 5.1
Я пытаюсь изменить введенный пользователем ввод до подтверждения проверки. Я следовал этим простым инструкциям, но когда я тестирую его на Laravel 5.1, он не работает. Я делаю что-то неправильно?
Это мой класс Request в 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
правило проверки на 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()
работает, но когда значение обрабатывается в классе проверки, оно не подвергалось дезинфекции.
Ответы
Ответ 1
Это сложно. Я только разобрался в одном способе добиться того, чего вы хотите.
Главное, что он не влияет на Validator, если вы измените значения запроса в функции 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().
Если вы переопределите эту функцию в своем собственном RequestClass, вы можете манипулировать значениями Request перед вызовом фактического родительского метода.
ОБНОВЛЕНИЕ (L5.5)
Если вы используете функцию проверки контроллеров, вы можете сделать что-то вроде этого:
$requestData = $request->all();
// modify somehow
$requestData['firstname'] = trim($requestData['firstname'];
$request->replace($requestData);
$values = $this-validate($request, $rules);
Ответ 2
Вы можете сделать это, изменив запрос и установив входное значение.
$request->request->set('key', 'value');
Или, если вы предпочитаете метод вспомогательного request
.
request()->request->set('key', 'value');
Ответ 3
Если вы используете запрос MyClassRequest
для сохранения вашей проверки, просто переопределите метод all() класса Request
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;
}
Надеюсь это поможет.
Ответ 4
Эти ответы больше не работают для меня в 5.5
вы можете использовать
protected function validationData()
{
$this->request->add([
'SomeField' => '..some code to modify it goes here'
]);
return $this->request->all();
}
метод add по запросу перезаписывает любой существующий вход для этого ключа.
Вы можете понять, почему это работает в Illuminate\Foundation\Http\FormRequest, если вы следуете по тропе
/**
* Get data to be validated from the request.
*
* @return array
*/
protected function validationData()
{
return $this->all();
}