Laravel 在中间件中修改请求?

Laravel 在中间件中修改请求?,laravel,filter,request,trim,middleware,Laravel,Filter,Request,Trim,Middleware,我注册了一个TrimInput中间件作为路由中间件,在请求到达控制器之前修剪所有用户输入。在中间件中,修剪似乎起作用,但当我在操作中转储请求时,请求似乎没有修改,就像以前没有中间件一样 这里有什么问题?问题是客户端请求,但为什么 // TrimInput.php <?php namespace App\Http\Middleware; use Closure; class TrimInput { /** * Handle an incoming request.

我注册了一个TrimInput中间件作为路由中间件,在请求到达控制器之前修剪所有用户输入。在中间件中,修剪似乎起作用,但当我在操作中转储请求时,请求似乎没有修改,就像以前没有中间件一样

这里有什么问题?问题是客户端请求,但为什么

// 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
}]); 

您应该首先在app/Http/Kernel.php文件中为中间件分配一个快捷键。如下

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

为了让中间件在
FormRequest
上修改请求输入,您需要使用
/app/Http/Requests/request.php
上的
all()
方法覆盖它,因为它是在中间件执行之前加载的。这是固定在拉威尔5.4我相信

这是对我有用的东西。在Request.php中添加此方法,它将应用中间件中所做的更改

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

    return parent::all();
}

使用框架的light\Foundation\Http/Middleware\TrimStrings.php
中间件并将其添加到您的
web
middleware组中

我已经在新安装的L5上验证了这一点,并且我得到了精简的输入。也许你应该试着运行
php artisan clear compiled
?@MarcinNabiałek我刚试过,但没用。你能把你的工作代码放到pastebin吗?我也有这个问题,我在5.2上,如果我使用请求Facade,输入会被修改并传播到控制器,但是当我注入我自己的请求时,它只会得到完整的未处理输入。我可以注意到,在中间件中,有一个
\lighting\Http\Request
实例,但最后您从
App\Http\Requests\ClientRequest
调用
all()
方法。我想这有点关系,但我不知道怎么解决。在这个问题上有什么进展吗?如果他正在转储中间件,并且该中间件出现了,那么它必须作为请求的一部分运行,因此可以假设他已经完成了上述操作,否则它将无法与他设置路由的方式配合使用。
public function all()
{
    $this->merge( $this->request->all() );

    return parent::all();
}