2015-08-06 13 views
9

Próbuję zmodyfikować wprowadzone przez użytkownika dane wejściowe przed pomyślnym sprawdzeniem poprawności. Śledziłem this easy instructions, ale kiedy testuję go na Laravel 5.1, to nie działa. Czy robię coś nie tak?Zmodyfikuj dane wejściowe przed sprawdzaniem poprawności na Laravel 5.1

To moja klasa Prośba o 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); 
    } 

} 

To jest mój zwyczaj reguły poprawności na 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  
} 

Kiedy zadzwonić do debugowania I uzyskać ten wyjściowe:

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] 

Wydaje się, że sanitize() działa, ale gdy wartość jest traktowana w klasie sprawdzania poprawności, nie została oczyszczona.

Odpowiedz

15

To jest trudne. Odkryłem tylko jeden sposób, by osiągnąć to, czego chcesz.

Najważniejsze jest to, że nie wpływa to na Walidatora, jeśli zmieni się Wartości Żądania w funkcji ().

Można zrobić obejście poprzez dodanie funkcji do UserCreateRequest:

protected function getValidatorInstance() { 
    $this->sanitize(); 
    return parent::getValidatorInstance(); 
} 

ta zastępuje rodzica getValidatorInstance();

metoda rodzica getValidatorInstance() zawiera

return $factory->make(
     $this->all(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes()); 

która jest osiągana przed kodem w przepisach() funkcji, więc starymi wartościami (nie wpływa na zmiany w przepisach()) z $ this- > wszystkie() są używane.

Jeśli zastąpisz tę funkcję w swojej własnej klasie RequestClass, możesz manipulować wartościami Request przed wywołaniem metody prawdziwego rodzica.

UPDATE (L5.5)

Jeśli używasz kontrolerów walidacji funkcjonować można zrobić coś takiego:

$requestData = $request->all(); 

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

    $request->replace($requestData); 

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

uratowałeś mój dzień. Dzięki! –

2

Jeśli używasz żądania MyClassRequest do utrzymania poprawności następnie po prostu zastępują wszystkie() metodę Request klasy

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; 
} 

nadzieję, że ten hel ps.

+0

Za pomocą tej metody nie modyfikujesz wartości wejściowych. Po prostu modyfikujesz sposób prezentacji wartości w ramach wszystkich metod. Podczas gdy działa to dla reguł sprawdzania poprawności, jeśli później chcesz uzyskać dostęp do pola wejściowego w kontrolerze za pomocą $ request-> get ("firstname"), otrzymasz niezmienioną wartość. Oznacza to, że otrzymujesz wartość, która w ogóle nie przejdzie walidatora ... –

+0

Zgadzam się, jeśli dobrze pamiętam, był to fragment kodu w moim produkcie, którego celem nie było modyfikowanie wartości, ale dokonanie walidacji w zmodyfikowanym wartości, widziałem, że OP jest na tych liniach. Dlaczego mój produkt nie potrzebował zmodyfikowanych wartości, ponieważ w danych wejściowych znajdowała się suma kontrolna/hasz, która po weryfikacji musi zostać ponownie zweryfikowana. – karmendra

+0

Jeśli użyjesz 'Input :: all()' lub '$ request-> all()' w twoim kontrolerze, wartości pozostaną zmodyfikowane. –

1

Można to zrobić, modyfikując żądanie i ustawiając wartość wejściową.

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

Lub, jeśli wolisz metodę pomocnika request.

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

Dlaczego jest on odrzucany? –

0

Odpowiedzi te nie działają już dla mnie w 5.5

można użyć

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

metoda add na życzenie nadpisuje istniejący wejście dla tego klucza.

Można zrozumieć, dlaczego to działa w Fundacji Illuminate \ \ http \ FormRequest, jeśli szlakiem

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