修改laravel中间件中的输入


Modify input in laravel middleware

一些服务向我的站点发出HTTP请求并传递一些输入。这个输入的结构对我来说有点错误,所以我试图修改它

我制作了一个中间件,并将这个中间件连接到我的路由上。句柄方法如下:

public function handle($request, Closure $next)
{
    $input = $request->all();
    // Input modification
    $request->replace($input);
    'Log::info($request->all()); // Shows modified request
    return $next($request);
}

然而,在我的控制器中,我得到了旧的输入。此外,我有点困惑,因为我也使用FormRequest,而且我意识到这两个请求是不同的实体。那么我如何修改中间件中的输入呢?

我不知道你的情况下到底有什么问题,但我会向你展示我做了什么让它发挥作用,它可能会解决你的问题:

app/Http/Middleware/TestMiddleware.php

<?php namespace App'Http'Middleware;
use Closure;
class TestMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  'Illuminate'Http'Request $request
     * @param  'Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $input = $request->all();
        if (isset($input['mod'])) {
            list($input['int'], $input['text']) = explode('-', $input['mod']);
            unset($input['mod']);
            // Input modification
            $request->replace($input);
            'Log::info($request->all()); // Shows modified request
        }
        return $next($request);
    }
}

app/Http/Kernel.php

protected $middleware = [
    'Illuminate'Foundation'Http'Middleware'CheckForMaintenanceMode',
    'Illuminate'Cookie'Middleware'EncryptCookies',
    'Illuminate'Cookie'Middleware'AddQueuedCookiesToResponse',
    'Illuminate'Session'Middleware'StartSession',
    'Illuminate'View'Middleware'ShareErrorsFromSession',
    'App'Http'Middleware'VerifyCsrfToken',
    Middleware'TestMiddleware::class, // this line added
];

app/Http/routes.php

 Route::get('/test', ['uses' => 'TestController@index']);

app/Http/Requests/SampleRequest.php

<?php namespace App'Http'Requests;
class SampleRequest extends Request
{        
    public function rules()
    {
        return [
            'int'              =>
                [
                    'required',
                    'integer'
                ],
            'text' => [
                'max: 5',
            ]
        ];
    }
}

app/Http/Controllers/TestController.php

<?php namespace App'Http'Controllers;
use App'Http'Requests;

class TestController extends 'Illuminate'Routing'Controller
{
    public function index(Requests'SampleRequest $request)
    {
       dd($request->all());
    }
}

在控制台中,我运行了composer dump-autoload

现在,当我运行以下网址时:

http://testproject.app/test?mod=23-tav

我从dd:进入控制器

array:2 [▼
  "text" => "tav"
  "int" => "23"
]

正如预期的那样,当我运行例如http://testproject.app/test?mod=abc-tav时,我被重定向到主页,因为数据没有通过SampleRequest的验证(int不是整数)