【问题标题】:Modify input in laravel middleware在 laravel 中间件中修改输入
【发布时间】:2016-03-02 17:43:05
【问题描述】:

某些服务向我的站点发出 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,而且我意识到这两个请求是不同的实体。那么如何修改中间件中的输入呢?

【问题讨论】:

  • 这是 Laravel 5 还是 5.1?
  • 你能把这个$request->replace()方法贴出来让我们看看它的作用吗?
  • 这是 Laravel 5.1 replace() 方法是 Laravel 内置的,不是我自己的方法
  • 我复制/粘贴了这段代码,设置了我自己的修改,它对我有用。

标签: php laravel laravel-5 laravel-5.1 laravel-middleware


【解决方案1】:

我不知道你的具体问题是什么,但我会告诉你我做了什么让它工作,它可能会解决你的问题:

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 不是整数)

【讨论】:

  • 很奇怪。当我使用浏览器或邮递员发出请求时,它可以工作,但在我的情况下,我试图从 ngrok 做到这一点(基本上我正在测试 webhook)。在 ngrok 的情况下它不起作用
  • 据此 (github.com/laravel/internals/issues/48),FormRequest 在某些情况下可能会忽略中间件。
  • 如果只想改变一个值,可以使用 $request->offsetSet(string $offset, mixed $value); laravel.com/api/5.4/Illuminate/Http/…
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2015-08-13
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多