我有一组动态构建的复杂规则,但理想情况下,我需要在继续下一组规则之前验证一组规则,即
我有一个 json 对象
{data: {}}
,我想在继续验证嵌套在 data
中的字段之前检查它是否存在,其中还有其他嵌套字段等。
我考虑过有一个
FormRequest
类,比如说 ApiRequest
,它可以验证 data
,然后是另一个 UploadRequest
,它可以在 data
已经被验证的基础上添加更多规则。
我可以做到这一点,并且它可以通过在
ApiRequest
的构造函数中注入 UploadRequest
来实现,这允许在继续下一组规则之前在 ApiRequest
中验证完整的规则集:
/**
* UploadRequest constructor.
* @param ApiRequest $apiRequest
*/
public function __construct(ApiRequest $apiRequest) {
// If we got here, ApiRequest passed validation, woo!
}
这看起来像是反模式还是“错误”的处理方式? 我试图想象一个由迷你请求组成的请求,即通过 api 的上传请求实际上是一个 api 请求,后面跟着一个上传请求等。但我不确定我是否只是想证明这一点我自己。
任何帮助将不胜感激。
谢谢!
您可以拥有一个
ApiRequest
类来验证所有端点的所有强制参数。
class ApiRequests extends FormRequest
{
public function rules()
{
return [
'data' => 'required',
'data.field_1' => 'required|string',
'data.field_2' => 'required|string'
];
}
}
假设您的 API 有一个可以编辑用户个人资料的端点。并且向该端点发出的请求必须包括
first_name
和last_name
。因此可以创建一个扩展 ApiRequest
的新类:
class EditUserRequest extends ClientRequest
{
public function rules()
{
return array_merge(parent::rules(), [
'params.first_name' => 'required',
'params.last_name' => 'required',
]);
}
}
这会将
ApiRequest
中的所有规则与 EditUserRequest
所需的规则合并。
然后在你的控制器中(例如
UsersController
):
public function update(EditUserRequest $request) {
.... your code goes here...
}