好吧,您可以将任何请求转换为任何其他请求,只要它从Illuminate\Http\Request
.
Laravel 基本上有两种方法将一个请求转换为另一个请求。MyRequest
这里的问题是,当作为参数传递时,作为注入的一部分,它永远不会自动获取验证对象或触发验证。它也可能会遗漏消息包和错误处理程序,但您无法像 Laravel 在注入请求时那样通过初始化请求来解决任何问题。
因此,您仍然必须触发FormRequest
启动特征时通常执行的所有序列(如果它扩展 FromRequest 而不是 Request),但仍然完全有可能并且只需做一些额外的工作,您就可以将任何请求转换为任何其他请求。
例如; 我正在使用此设置来调用一条路线profile/{section}/save
来保存我的个人资料设置。根据$section
's 的值,我将给定的值转换为我对该特定值的$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);
}
...
因此,为了让人们开始使用 aFormRequest
作为示例,基本上就是这样。
不要从 default 扩展所有自定义请求,而是使用扩展自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);
}