2015-08-06 3 views
9

Я пытаюсь изменить введенный пользователем ввод до подтверждения проверки. Я следил за this easy instructions, но когда я тестирую его на Laravel 5.1, он не работает. Я делаю что-то неправильно?Измените ввод перед валидацией на 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() работает, но когда значение обрабатывается классом проверки, оно не подвергалось дезинфекции.

ответ

15

Это сложный вопрос. Я только разобрался в одном способе добиться того, чего вы хотите.

Главное, что он не влияет на валидатор, если вы измените значения запроса в функции ().

Вы могли бы сделать обходной путь, добавив функцию к вашему 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()); 

, которая достигается перед кодом в правилах() функции, поэтому старые значения (не зависит от изменений в правилах()) в $ this- > all().

Если вы переопределите эту функцию в своем собственном RequestClass, вы можете манипулировать значениями Request перед вызовом метода фактического родителя.

UPDATE (L5.5)

Если вы используете контроллеры проверки функции, которые вы могли бы сделать что-то вроде этого:

$requestData = $request->all(); 

    // modify somehow 
    $requestData['firstname'] = trim($requestData['firstname']; 

    $request->replace($requestData); 

    $values = $this-validate($request, $rules); 
+0

Вы спасли мой день. Благодаря! –

2

Если вы используете запрос MyClassRequest для поддержания вашего проверки, то просто переопределить все() метод 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; 
} 

Надежда этого он LPS.

+0

С помощью этого метода вы вообще не изменяете входные значения. Вы просто изменяете, как значения отображаются во всем методе. Хотя это работает для правил проверки, если вы позже захотите получить доступ к полю ввода в вашем контроллере с помощью $ request-> get ('firstname'), вы все равно получите неизмененное значение. Это означает, что вы получите значение, которое не прошло проверку валидатора ... –

+0

Я согласен, если я правильно помню, это был фрагмент кода в моем продукте, где намерение не было изменять значения, но выполнять проверку на измененных Я понял, что ОП на этих линиях. Почему мой продукт не нуждался в измененных значениях, поскольку на входе была контрольная сумма/хеш, которая должна быть пересчитана после проверки. – karmendra

+0

Если вы используете 'Input :: all()' или '$ request-> all()' в вашем контроллере, значения остаются модифицированными. –

1

Вы можете сделать это, изменив запрос и установив входное значение.

$request->request->set('key', 'value'); 

Или, если вы предпочитаете метод request помощника.

request()->request->set('key', 'value'); 
+0

Почему это вниз? –

0

Эти ответы больше не работают для меня в 5.5

вы можете использовать

protected function validationData() 
{ 
    $this->request->add([ 
     'SomeField' => '..some code to modify it goes here' 
    ]); 
    return $this->request->all(); 
} 

метод добавить по запросу перезаписывает любой существующий вход для данного ключа.

Вы можете понять, почему это работает в Illuminate \ Foundation \ Http \ СформироватьЗапрос, если вы будете следовать след

/** 
* Get data to be validated from the request. 
* 
* @return array 
*/ 
protected function validationData() 
{ 
    return $this->all(); 
}