【问题标题】:Laravel - Middleware custom typed Request parameterLaravel - 中间件自定义类型请求参数
【发布时间】:2022-02-13 01:04:16
【问题描述】:

我想使用VacancyListRequest 来传递中间件参数,并在控制器操作之前使用它的规则来验证它们。我知道中间件是流水线模式,但是有没有人知道如何使用除默认 \Illuminate\Http\Request 之外的任何自定义类型?

中间件

public function handle(VacancyListRequest $request, Closure $next)
{
    $request = $this->analizeQuery($request);
    $request = $this->formatValues($request);
    $request = $this->prepareParams($request);

    return $next($request);
}

控制器

 public function index(VacancyListRequest $request, bool $asQuery = false)

错误

App\Http\Middleware\Vacancy\BeforeVacancyIndexRequestMiddleware::handle(): 参数 #1 ($request) 必须是类型 应用\Http\Requests\Vacancy\VacancyListRequest, Illuminate\Http\Request 给定,

【问题讨论】:

  • 类型转换 handle(VacancyListRequest $request, Closure $next) 的原因是什么?您期望每个请求的类型都是 VacancyListRequest
  • @InsaneSkull 我想为特定类型的请求制作中间件,并在它在控制器中使用之前执行一些操作(比如一些取决于请求数据的分析内容和查询构建),然后使用这个规则此请求的特定类型(因为不想从那里移动验证和身份验证逻辑)。更多 - 我想在这种类型的请求中将一些变量从中间件传递给控制器​​

标签: php laravel dependency-injection laravel-8 type-hinting


【解决方案1】:

您收到该错误是因为您将 $request 作为中间件的句柄方法的参数传递,该方法的类型为 VacancyListRequest 而不是 Illuminate\Http\Request 类型。

你应该把中间件改成这样

use Illuminate\Http\Request;
use Closure;
 
class VacancyListRequest
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $request = $this->analizeQuery($request);
        $request = $this->formatValues($request);
        $request = $this->prepareParams($request);


        return $next($request);
    }
}

但是在你的控制器中应该是这样的

// At the top of you controller file you add this 
use App\Http\Requests\Vacancy\VacancyListRequest;


// And define the controller method like this 
public function index(VacancyListRequest $request, bool $asQuery = false)

handle 方法的第一个参数必须是 \Illuminate\Http\Request 类型,就像它在文档 # Defining Middleware 中定义的那样

【讨论】:

  • 我不明白这个问题 - 我想在中间件中使用 CUSTOM 类型的请求,问题是关于如何仅使用 Request 默认类型来解决问题
猜你喜欢
  • 2020-02-15
  • 1970-01-01
  • 2017-05-30
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2019-07-04
  • 1970-01-01
相关资源
最近更新 更多