2015-08-06 12 views
9

Sto tentando di modificare un input inviato dall'utente prima del successo della convalida. Ho seguito this easy instructions, ma quando lo provo su Laravel 5.1, non funziona. Sto facendo qualcosa di sbagliato?Modificare l'input prima della convalida su Laravel 5.1

Questa è la mia richiesta classe su 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); 
    } 

} 

Questa è la mia regola di convalida personalizzata su 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  
} 

Quando chiamo per il debug ottengo questo output:

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] 

Sembra che sanitize() funziona, ma quando il valore viene trattato sulla classe di convalida non è stato disinfettato.

risposta

15

Questo è un problema. Ho solo trovato un modo per ottenere quello che vuoi.

Il punto principale è che non ha effetto per il Validatore se si modificano i Valori richiesta nella funzione ().

Si potrebbe fare una soluzione con l'aggiunta di una funzione per il vostro UserCreateRequest:

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

Questo sovrascrive getValidatorInstance del genitore();

metodo del genitore getValidatorInstance() include

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

che si raggiunge prima il codice nelle regole() la funzione, in modo che i vecchi valori (non influenzato dai cambiamenti nelle regole()) di $ this- > vengono utilizzati tutti().

Se si esegue l'override di quella funzione nella propria RequestClass, è possibile modificare i valori della richiesta prima di chiamare il metodo del genitore effettivo.

UPDATE (L5.5)

Se si utilizzano i controller di convalidare funziona si potrebbe fare qualcosa di simile:

$requestData = $request->all(); 

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

    $request->replace($requestData); 

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

mi hai salvato la giornata. Grazie! –

2

Se si utilizza una richiesta MyClassRequest per mantenere il vostro convalida poi semplicemente ignorare il metodo tutto() della classe 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; 
} 

Spero che questo hel ps.

+0

Con questo metodo non si modificano affatto i valori di input. Basta modificare il modo in cui i valori sono presentati all'interno di tutti i metodi. Mentre questo funziona per le regole di validazione, se in seguito vuoi accedere a un campo di input nel tuo Controller con $ request-> get ('firstname') otterrai comunque il valore non modificato. Ciò significa che si ottiene un valore che non ha superato affatto il validatore ... –

+0

Sono d'accordo, se ricordo bene questo era un pezzo di codice nel mio prodotto in cui l'intento non era quello di modificare i valori ma fare la validazione su modificato valore, ho percepito OP su queste linee. Perché il mio prodotto non ha avuto bisogno dei valori modificati, in quanto c'era un checksum/hash nell'input, che deve essere ricalcolato e verificato dopo la validazione. – karmendra

+0

Se si utilizza 'Input :: all()' o '$ request-> all()' nel controller i valori rimangono modificati. –

1

È possibile eseguire questa operazione modificando la richiesta e impostando il valore di input.

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

O, se si preferisce il metodo request aiutante.

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

Perché è down down? –

0

Queste risposte non funzionano più per me in 5.5

è possibile utilizzare

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

il metodo add su richiesta sovrascrive qualsiasi input esistente per quella chiave.

Si può capire perché questo funziona in Illuminate \ Foundation \ Http \ FormRequest, se si segue il sentiero

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