首页 > 解决方案 > 自定义请求的中间件

问题描述

我创建了验证数据的请求。我需要将其中一些数据转换为 JSON。为此,我决定创建中间件。但是当我尝试在控制器中获取请求时,它没有我在中间件中添加的任何内容。这似乎是因为进入中间件的不是我自己的请求“MyRequest $request”。如何解决?

中间变量

class TransformData
{

    /**
     * @param $request
     * @param Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
     $next($request);

        $request->merge(['user_id' => \Auth::user()->id]);
     $request->merge(['select_products' => json_encode($request->select_products)]);
        return $request;
    }
}

我的请求称为 OfferRequest,只有验证规则

控制器

class BaseController extends Controller
{
    public function __construct()
    {
        $this->middleware('transform.offer.data')->only('store');
    }

}
    public function store(OfferRequest $request)
    {


        $all = $request->all();
        dd($all); // there is nothing here that I added in the middleware

    }

我将中间件添加到内核 - 受保护的 $routeMiddleware

标签: phplaravel

解决方案


更新您的中间件,如下所示:

转换数据.php

class TransformData
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $request->merge([
            'user_id' => \Auth::user()->id,
            'select_products' => json_encode($request->select_products)
        ]);

        return $next($request);
    }
}

以上方法可行,但我建议您使用表单请求类中的prepareForValidation()方法链接来更新请求数据。

使用prepareForValidation()方法,您可以添加或更新您的请求参数。 OfferRequest.php

class AccountFilterRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        //your rules
    }

    /**
    * Modify the input.
    */
    public function prepareForValidation()
    {
        $this->merge([
            'user_id' => \Auth::user()->id,
            'select_products' => json_encode($request->select_products)
        ]);
    }
}

prepareForValidation()方法在验证之前执行,因此您可以添加新数据或更新数据并验证它们。


推荐阅读