好吧,您可以将任何请求转换为任何其他请求,只要它从 Illuminate\Http\Request 扩展即可。
Laravel 基本上有两种方法可以将一个请求转换为另一个请求。这里的问题是,当MyRequest 作为参数传递时,作为注入的一部分,它永远不会自动获取验证对象或触发验证。它也可能会遗漏消息包和错误处理程序,但您无法像 Laravel 在注入请求时那样通过初始化请求来解决任何问题。
因此,您仍然必须触发 FormRequest(如果它扩展 FromRequest 而不是 Request)通常在启动 trait 时执行的所有序列,但仍然完全有可能,只需做一些额外的工作,您就可以转换任何请求任何其他请求。
例如;我正在使用这个设置来调用一个路由profile/{section}/save 来保存我的配置文件设置。根据$section 的值,我将给定的$Request 转换为我对该特定$section 的任何自定义表单请求。
use App\Http\Requests\MyRequest;
use Illuminate\Http\Request;
...
public function someControllerMethod(Request $Request) {
$MyRequest = MyRequest::createFrom($Request);
// .. or
$MyRequest = MyRequest::createFromBase($Request);
}
...
所以要让人们开始使用FormRequest 作为示例,基本上就是这样。
不要从默认 Illuminate\Foundation\Http\FormRequest 扩展您的所有自定义请求,而是使用从 FormRequest 扩展的基类并添加自定义方法来转换和引导请求,就像它作为参数传递一样。
namespace App\Http\Requests;
use Illuminate\Routing\Redirector;
use Illuminate\Foundation\Http\FormRequest;
class BaseFormRequest extends FormRequest {
public function convertRequest(string $request_class) : BaseFormRequest {
$Request = $request_class::createFrom($this);
$app = app();
$Request
->setContainer($app)
->setRedirector($app->make(Redirector::class));
$Request->prepareForValidation();
$Request->getValidatorInstance();
return $Request;
}
public function authorize() {
return true;
}
public function rules() {
return [];
}
}
让您所有的自定义FormRequest 扩展您的BaseFormRequest
namespace App\Http\Requests;
class MyRequest extends BaseFormRequest {
...
}
现在,您可以在任何想要convert 请求的地方使用控制器方法中的基类,并使用convertRequest 将其转换为您希望转换的自定义请求类。
public function someControllerMethod(BaseFormRequest $Request) {
$MyRequest = $Request->convertRequest(MyRequest::class);
}