2015-05-30 36 views
5

Mam oprogramowanie pośredniczące TrimInput zarejestrowane jako oprogramowanie pośrednie dla moich tras w celu przycięcia wszystkich danych wejściowych użytkownika przed wysłaniem żądania do kontrolera. Wewnątrz middleware przycinanie wydaje się działać, ale kiedy zrzucam żądanie w akcji, żądanie wydaje się niezmodyfikowane, tak jak wcześniej nie było oprogramowania pośredniego.Zmienić żądanie w oprogramowaniu pośredniczącym?

Na czym polega problem? Problemem jest ClientRequest, ale dlaczego?

// 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: Okazało się, że powyższy kod działa, ale niestety mój ClientRequest ignoruje 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

I zostały zweryfikowane to na świeżym L5 zainstalować i Dostaję przyciętego wejście . Może powinieneś spróbować uruchomić 'php artisan clear-compiled'? –

+0

@ MarcinNabiałek Właśnie go wypróbowałem i nie zadziałało. Czy możesz umieścić swój działający kod w pastebin? –

+1

Mam również ten problem, jestem na 5.2, jeśli użyję elewacji żądania, dane wejściowe zostaną zmodyfikowane i propagowane do kontrolera, ale kiedy wstrzyknę własną prośbę, po prostu otrzymam pełne nieprzetworzone dane wejściowe. Zauważyłem, że w oprogramowaniu pośredniczącym istnieje instancja '\ Illuminate \ Http \ Request', ale na końcu wywołuje się metodę' all() 'z' App \ Http \ Requests \ ClientRequest'. Myślę, że to ma coś wspólnego, ale nie wiem, jak to rozwiązać. Jakieś postępy w tym pytaniu? – Anfelipe

Odpowiedz

0

Najpierw należy przypisać middleware klucz krótki dłoń w swojej aplikacji/HTTP/Kernel.php plików. jak poniżej

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

Jeśli wyładowuje oprogramowanie pośrednie i to się pojawia, to musi być uruchomione jako część żądania, więc można by założyć, że zrobił już to, co powyżej, w przeciwnym razie nie działałoby to ze sposobem, w jaki skonfigurował routing. –

+0

Dobra, już to zrobiłem. –

0

W postanowieniu middleware i modyfikować do wejścia na żądanie FormRequest, trzeba go zastąpić stosując metodę all() na /app/Http/Requests/Request.php ponieważ jest załadowany przed middleware jest wykonywany. Zostało to naprawione w Laravel 5.4.

Oto, co sprawdziło się u mnie. Dodaj tę metodę w aplikacji Request.php i zastosuje zmiany wprowadzone w oprogramowaniu pośredniczącym.

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

    return parent::all(); 
} 
0

wykorzystanie ram oświetlają \ Fundacja \ HTTP/Middleware \ TrimStrings.php middleware i dodać go do web grupy middleware