【问题标题】:How does a Laravel controller method handle multiple Form Request parameters?Laravel 控制器方法如何处理多个表单请求参数?
【发布时间】:2019-04-30 07:05:23
【问题描述】:

几年后我回到 Laravel 并试图了解在 Laravel 中编码的现有 REST API 是如何工作的。我无法理解具有多个表单请求参数的特定控制器方法是如何工作的(或者如果确实如此)。

REST API 是在 Laravel 5.1 中编码的。我查看了官方文档(5.1 和最新版本)并尝试在网络和 SO 中搜索相关主题(例如,“laravel 控制器多个表单请求”、“laravel 控制器多个类型提示请求”等) ,但我似乎找不到明确的解释。可能是我看错了角度。

public function store(ProductRequest $productRequest, PromoRequest $promoRequest)
{
    // Validate product
    $product = new Product($productRequest->all());
    // Validate promo
    if ($promoRequest->get('promo')) {
        $promo = new Promo($promoRequest->get('promo'));
    }

    ...
}

在大多数文档中,控制器只接受一个 Request 对象。我确实看到了一些具有多个表单请求参数的示例,但通常建议它们只使用一个表单请求。但抛开最佳实践不谈,这段代码是如何工作的?当这个方法被调用时,Laravel 是如何知道如何将 Request 拆分为两个独立的 Form Request 类的?

请随时告诉我是否以及如何更清楚地解释我的问题。

【问题讨论】:

  • 您将实例、类定义(延迟加载)等值填充到容器中。然后给出需要的东西,技术上使用反射来读取上述情况的控制器类方法参数。

标签: laravel


【解决方案1】:

Laravel 服务容器是一个强大的类管理工具 依赖和执行依赖注入。依赖注入 是一个花哨的短语,本质上是这样的:类依赖是 通过构造函数“注入”到类中,或者在某些情况下, “setter”方法。

您可以在此处阅读更多信息:https://laravel.com/docs/5.8/container

编辑:附加问题: 不过,我还是不明白如何将 HTTP 请求(只有一个)拆分为两个不同的请求类? p>

HTTP 请求未拆分;它只是通过两个类发送。

例如:

function example(Request $request) { 
    $productRequest = new ProductRequest($request);
    $promoRequest = new PromoRequest($request);
}

应该是一样的。

【讨论】:

  • 感谢链接,我已经扫描了它,可以更好地理解依赖注入是如何工作的。尽管如此,我还是不明白如何将 HTTP 请求(只有一个)拆分为 2 个不同的请求类?这个问题有意义吗?
  • 啊,我明白了……嗯,这真的让事情变得清晰了很多!这在任何文档中都提到过吗?无论如何,谢谢你!这绝对是我一直在寻找的答案。
  • 这会产生TypeError: Argument 1 passed to Symfony\Component\HttpFoundation\Request::__construct() must be of the type array, object given,等错误
  • @Shulz 以上是伪代码,旨在说明它是如何工作的,并不打算使用。
【解决方案2】:

你可以这样写:

function example(Request $request) { 
    $productRequest = new ProductRequest($request->all());
    $promoRequest = new PromoRequest($request->all());
}

但在验证时,您应该将方式更改为:

$data = $productRequest->validate($productRequest->rules());

我在 laravel 8 中测试的另一种方法是在 methd 参数中添加两个表单请求对象,例如:

function example(ProductRequest $productRequest,PromoRequest $promoRequest) { 
    $productRequest->validated();
    $promoRequest->validated();
}

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 2017-03-22
    • 2020-06-12
    • 2019-03-17
    • 1970-01-01
    • 2015-10-22
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多