【发布时间】:2019-04-13 02:17:23
【问题描述】:
我在表单请求验证以及如何使用一个 API 路由处理它方面遇到了一个小问题。
我需要创建的资源依赖于其他资源。
(这里的 EmailSettings 属于租户)
所以我的路线看起来应该是这样的:/api/tenants/{id}/email_settings
我的请求验证需要几个字段,包括 tenantId :
public function rules() {
return [
'email' => 'bail|required|email|unique:email_settings,email',
'name' => 'bail|required',
'username' => 'bail|required',
'password' => 'bail|required'
'imapHost' => 'bail|required',
'imapPort' => 'bail|required',
'imapEncryption' => 'bail|required',
'imapValidateCert' => 'bail|required',
'smtpHost' => 'bail|required',
'smtpPort' => 'bail|required',
'smtpEncryption' => 'bail|required',
'tenantId' => 'bail|required',
];
}
我这样发送请求:
try {
const response = await this.tenantForm.post('/api/tenants')
let newTenant = helpers.getNewResourceFromResponseHeaderLocation(response)
let tenantId = parseInt(newTenant.id);
try {
await this.emailSettingsForm.post('/api/tenants/' + tenantId + '/email_settings')
this.requestAllTenants()
} catch ({response}) {
$('.second.modal').modal({blurring: true, closable: false}).modal('show');
}
} catch ({response}) {
$('.first.modal').modal({blurring: true}).modal('show');
}
因此,tenantId 作为参数而不是在请求正文中传递以遵守 REST 约定。 但问题出在我的控制器中,当我合并数据以创建资源时,仅在合并之前对正文数据进行了验证。
public function store(EmailSettingValidation $request, $tenant_id) {
$emailSetting = $this->emailSettingService->create(
array_merge($request->all(), compact($tenant_id))
);
return $this->response->created($emailSetting);
}
那么正确处理它的最佳方法是什么?
- 在正文中传递 id ?看起来很乱
- 使用验证器手动验证?我希望保留表单验证
- 删除tenantId规则并手动检查?
有什么建议吗? 谢谢
【问题讨论】:
-
你的租户表有模型吗?
-
@TravisBritz 是的,但为什么它很重要?
标签: laravel rest api validation