几年后,我将回到Laravel,并试图了解Laravel中编码的现有REST API的工作方式。我不明白带有多个“表单请求”参数的特定控制器方法的工作原理(或实际上是否可行)。
REST API是用Laravel 5.1编码的。我查看了官方文档(包括5.1和最新版本),并尝试在Web和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对象。我确实确实看到了一些具有多个Form Request参数的示例,但通常建议它们仅使用一个Form Request。除了最佳实践,此代码如何工作?调用此方法时,Laravel如何知道如何将请求拆分为两个单独的表单请求类?
请随时让我知道是否以及如何更清楚地解释我的问题。
答案 0 :(得分:0)
Laravel服务容器是用于管理类的强大工具 依赖项并执行依赖项注入。依赖注入 是一个花哨的短语,从本质上讲是这样:类依赖是 通过构造函数“注入”到类中,或者在某些情况下, “设置”方法。
您可以在此处了解更多信息:https://laravel.com/docs/5.8/container
编辑:其他问题: 仍然,我不明白如何将HTTP请求(只有一个)拆分为两个不同的Request类? >
HTTP请求未拆分;它只是通过两个类发送。
例如:
function example(Request $request) {
$productRequest = new ProductRequest($request);
$promoRequest = new PromoRequest($request);
}
会一样。
答案 1 :(得分:0)
你可以这样写:
function example(Request $request) {
$productRequest = new ProductRequest($request->all());
$promoRequest = new PromoRequest($request->all());
}
但是在验证时你应该改变这样的方式:
$data = $productRequest->validate($productRequest->rules());
我在 laravel 8 中测试的另一种方法是在方法参数中添加两个表单请求对象,例如:
function example(ProductRequest $productRequest,PromoRequest $promoRequest) {
$productRequest->validated();
$promoRequest->validated();
}