定制请求的中间件

时间:2019-11-25 14:42:58

标签: php laravel

我创建了验证数据的请求。我需要将其中一些数据转换为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

1 个答案:

答案 0 :(得分:0)

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

TransformData.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()方法link来更新请求数据。

使用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()方法在验证之前执行,因此您可以添加新数据或更新数据并进行验证。