2015-05-30 13 views
5

Ho un middleware TrimInput registrato come middleware per i miei percorsi per tagliare tutto l'input dell'utente prima che la richiesta colpisca il controller. All'interno del middleware la rifinitura sembra funzionare, ma quando scarico la richiesta nell'azione la richiesta sembra non modificata come prima non c'era nessun middleware.Modifica la richiesta nel middleware?

Qual è il problema qui? Il problema è il ClientRequest ma perché?

// TrimInput.php 
<?php namespace App\Http\Middleware; 

use Closure; 

class TrimInput { 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) { 
     $request->replace($this->trimArrayRecursive($request->all())); 
     // When I dump $request right here, all seems fine (the input is trimmed) 

     return $next($request); 
    } 

    protected function trimArrayRecursive($input) { 
     if (!is_array($input)) { 
      return trim($input); 
     } 

     return array_map([$this, 'trimArrayRecursive'], $input); 
    } 

} 


// Somwhere in my routes.php 
Route::post('/test', ['middleware' => 'trim', 'uses' => function(\App\Http\Requests\ClientRequest $request) { 
    dd($request->all()); // Unfortunately dumps the unfiltered (untrimmed) input 
}]); 

EDIT: Si è scoperto, che il codice di cui sopra è in funzione, ma purtroppo la mia ClientRequest ignora il TrimInputMiddleware.

// ClientRequest.php 
<?php namespace App\Http\Requests; 

class ClientRequest extends Request { 

    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() { 
     return true; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() { 
     $idToIgnore = $this->input('id'); 

     return [ 
      'name'   => 'required|max:255|unique:clients,name,' . $idToIgnore, 
      'street'   => 'required|max:255', 
      'postal_code' => 'required|digits:5', 
      'city'   => 'required|max:255', 
      'contact_person' => 'required|max:255' 
     ]; 
    } 

} 
+0

Ho verificato questo su L5 nuova installazione e sto ottenendo ingresso rifilato . Forse dovresti provare a eseguire 'php artisan clear-compiled'? –

+0

@ MarcinNabiałek L'ho appena provato e non ha funzionato. Potresti mettere il tuo codice di lavoro su pastebin? –

+1

Ho anche questo problema, sono in 5.2, se uso Request Facade, l'input viene modificato e propagato al controller, ma quando inserisco la mia richiesta, ottiene l'intero input non elaborato. Posso notare che quando ci si trova nel middleware c'è un'istanza di '\ Illuminate \ Http \ Request', ma alla fine si chiama il metodo' all() 'da un 'App \ Http \ Requests \ ClientRequest'. Immagino che questo abbia qualcosa da fare, ma non so come risolverlo. Qualche progresso su questa domanda? – Anfelipe

risposta

0

Si dovrebbe prima di assegnare il middleware una chiave di breve mano in app/HTTP/Kernel.php file. come qui di seguito

protected $routeMiddleware = [ 
    'auth' => 'App\Http\Middleware\Authenticate', 
    'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth', 
    'guest' => 'App\Http\Middleware\RedirectIfAuthenticated', 
    'trim' => 'App\Http\Middleware\TrimInput ', 
]; 
+1

Se sta scaricando il middleware e questo viene mostrato, allora deve essere eseguito come parte della richiesta, quindi si presume che abbia già fatto quanto sopra, altrimenti non funzionerebbe con il modo in cui ha impostato il suo routing. –

+0

Giusto, l'ho già fatto. –

0

Affinché il middleware per e modificare l'ingresso richiesta su FormRequest, è necessario sovrascrivere con il metodo all() su /app/Http/Requests/Request.php perché è caricata prima dell'esecuzione il middleware. Questo è stato risolto in Laravel 5.4 credo.

Ecco cosa ha funzionato per me. Aggiungi questo metodo in Request.php e applicherà le modifiche fatte nel tuo middleware.

public function all() 
{ 
    $this->merge($this->request->all()); 

    return parent::all(); 
} 
0

uso Illuminate \ Fondazione del framework \ Http/Middleware \ TrimStrings.php middleware e aggiungerlo al tuo gruppo middleware web

Problemi correlati