2015-05-30 11 views
5

Ich habe eine TrimInput Middleware als Middleware für meine Routen registriert, um alle Benutzereingaben zu trimmen, bevor die Anfrage den Controller trifft. Innerhalb der Middleware scheint das Trimmen zu funktionieren, aber wenn ich die Anfrage in der Aktion ablege, scheint die Anfrage unverändert zu sein, als ob es vorher keine Middleware gegeben hätte.Anfrage in Middleware ändern?

Was ist das Problem hier? Das Problem ist die ClientRequest, aber warum?

// 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: Es stellte sich heraus, dass der obige Code funktioniert, aber leider ignoriert meine ClientRequest die 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

ich das auf frische L5 prüft haben installieren und ich bin immer getrimmt Eingang . Vielleicht sollten Sie versuchen, 'php artisan clear-compiled' auszuführen? –

+0

@ MarcinNabiałek Ich habe es gerade versucht und es hat nicht funktioniert. Könntest du deinen Arbeitscode in pastebin schreiben? –

+1

Ich habe auch dieses Problem, ich bin auf 5.2, wenn ich Request Facade verwenden, wird die Eingabe geändert und an den Controller weitergegeben, aber wenn ich meine eigene Anfrage injiziere, erhält es nur die vollständige unverarbeitete Eingabe. Ich kann feststellen, dass es in der Middleware eine Instanz von \ Illuminate \ Http \ Request gibt, aber am Ende rufen Sie die Methode 'all()' aus 'App \ Http \ Requests \ ClientRequest' auf. Ich denke, das hat etwas zu tun, aber ich weiß nicht, wie ich es lösen soll. Irgendwelche Fortschritte in dieser Frage? – Anfelipe

Antwort

0

Sie sollten zuerst die Middleware eine kurze Hand Schlüssel in Ihrer app/Http/Kernel.php Datei zuordnen. wie unten

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

Wenn er die Middleware ausgibt und diese angezeigt wird, muss sie als Teil der Anfrage ausgeführt werden, also würde man annehmen, dass er das bereits oben getan hat, sonst würde es nicht mit der Art funktionieren, wie er sein Routing eingerichtet hat. –

+0

Richtig, ich habe das schon getan. –

0

Damit die Middleware und die Anforderungseingabe auf FormRequest zu ändern, müssen Sie es mit der all() Methode auf /app/Http/Requests/Request.php zu überschreiben, weil es vor der Middleware geladen wird ausgeführt. Dies wurde in Laravel 5.4 behoben, glaube ich.

Hier ist was für mich gearbeitet. Fügen Sie diese Methode in Request.php hinzu und die in Ihrer Middleware vorgenommenen Änderungen werden übernommen.

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

    return parent::all(); 
} 
0

Nutzung der Illuminate \ Foundation Framework \ Http/Middleware \ TrimStrings.php Middleware und fügen Sie sie web Middleware Gruppe