我正在為我們的專案創建一個新的 API 呼叫。
我們有一張帶有不同語言環境的桌子。前任:
ID Code
1 fr_CA
2 en_CA
但是,當我們呼叫 API 來創建 Invoices 時,我們不想發送 id 而是發送代碼。
這是我們發送的物件的示例:
{
"locale_code": "fr_CA",
"billing_first_name": "David",
"billing_last_name": "Etc"
}
在我們的控制器中,我們將 修改locale_code為locale_id使用擴展名為 的函式FormRequest:
// This function is our method in the controller
public function createInvoice(InvoiceCreateRequest $request)
{
$validated = $request->convertLocaleCodeToLocaleId()->validated();
}
// this function is part of ApiRequest which extend FormRequest
// InvoiceCreateRequest extend ApiRequest
// So it goes FormRequest -> ApiRequest -> InvoiceCreateRequest
public function convertLocaleCodeToLocaleId()
{
if(!$this->has('locale_code'))
return $this;
$localeCode = $this->input('locale_code');
if(empty($localeCode))
return $this['locale_id'] = NULL;
$locale = Locale::where(Locale::REFERENCE_COLUMN, $localeCode)->firstOrFail();
$this['locale_id'] = $locale['locale_id'];
return $this;
}
如果我們$this->input('locale_id')在函式內部進行轉儲,它會回傳正確的 ID (1)。但是,當它通過時,即使它是規則的一部分validated();,它也不會回傳:locale_id
public function rules()
{
return [
'locale_id' => 'sometimes'
];
}
我還嘗試了合并、添加、設定等功能,但沒有任何效果。
有任何想法嗎?
uj5u.com熱心網友回復:
將FormRequest在到達控制器之前運行。所以試圖在控制器中這樣做是行不通的。
您可以執行此操作的方法是在類中使用prepareForValidation()方法FormRequest。
// InvoiceCreateRequest
protected function prepareForValidation()
{
// logic here
$this->merge([
'locale_id' => $localeId,
]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/425336.html
