我試圖在驗證之前洗掉一些欄位。
試圖在 prepareForValidation() 中嘗試這個
use Illuminate\Foundation\Http\FormRequest;
class VideoRequest extends ApiRequest
{
// ..code..
protected function prepareForValidation()
{
$this->merge([
'public' => $this->toBoolean($this->public),
'notify' => $this->toBoolean($this->notify),
]);
$video_id = $this->route('video_id');
if($this->isMethod('put') && Video::salesStarted($video_id)){
Log::info('removing sales');
// attempt 1
$this->except(['sales_start', 'tickets', 'price']);
// attempt 2
$this->request->remove('sales_start');
// attempt 3
$this->offsetUnset('sales_start');
}
if($this->isMethod('put') && Video::streamStarted($video_id)){
Log::info('removing streams');
// attempt 1
$this->except(['stream_start', 'stream_count', 'archive']);
// attempt 2
$this->request->remove('sales_start');
// attempt 3
$this->offsetUnset('sales_start');
}
$thumb = $this->uploadThumbnail($video_id);
if($thumb !== null){
$this->merge($thumb);
}
}
// ..code..
}
我確保代碼在if陳述句中輸入,但是這些欄位沒有被洗掉。
運行$this->request->remove()并$this->except()沒有效果。
如果我添加safe()它會拋出Call to a member function safe() on null.
我也嘗試使用unset(),但似乎沒有任何效果。
日期規則如下:
'sales_start' => 'sometimes|required|date|after:now|before:stream_start',
'stream_start' => 'sometimes|required|date|after:now',
但是$request->validated()回傳錯誤,盡管它不應該驗證已洗掉的欄位。
"sales_start": [
"The sales start must be a date after now."
],
"stream_start": [
"The stream start must be a date after now."
]
為什么欄位沒有被洗掉?
編輯
根據要求,我添加了一些代碼。
這是 ApiRequest 的樣子:
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
abstract class ApiRequest extends FormRequest
{
protected function failedValidation(Validator $validator): void
{
$response['data'] = [];
$response['api_status'] = 'ng';
$response['status_message'] = 'failed validation';
$response['errors'] = $validator->errors()->toArray();
throw new HttpResponseException(
response()->json( $response, 422 )
);
}
protected function toBoolean($booleable)
{
return filter_var($booleable, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
}
}
并且從控制器呼叫請求,如下所示:
public function update(VideoRequest $request, $video_id)
{
... some code ...
$validated = $request->validated();
... some code ...
}
so$this指的是繼承 FormRequest 的 VideoRequest。
uj5u.com熱心網友回復:
找不到任何關于洗掉的內容。但是根據Laravel 檔案,您可以從請求中選擇所需的密鑰,如下所示:
$request->only(['username', 'password']);
// plug everything you need into the array.
$request->except(['username', 'password']);
//plug everything you don't need into the array
后者可能對您最有用。
例子:
假設我有以下鍵:['username', 'password', 'randomVal'];
$request->only(['username', 'password']);
// Output:
['username', 'password']
$request->except(['username', 'password']);
// Output:
['randomVal']
uj5u.com熱心網友回復:
Request要在 a進入控制器之前從 a 中洗掉(取消設定)密鑰,您可以在請求中使用offsetUnset()
:
protected function prepareForValidation()
{
$this->offsetUnset('sales_start');//same goes for the other key to remove...
}
uj5u.com熱心網友回復:
這是一個有點丑陋的答案。
我沒有在驗證之前修改請求,而是嘗試在獲取rules().
所以沿著這些思路:
public function rules() {
$ex = $this->isMethod('put') && Video::salesStarted($video_id) ? 'exclude|' : '';
return [
'sales_start' => $ex.'sometimes|required|other_stuff',
];
}
請注意,驗證“排除”僅在首先添加時才有效。
所以這行不通:
'sometimes|required|other_stuff|exclude' //exclude is called last
我仍然無法找出為什么remove(), exclude(), offsetUnset()不起作用,所以這不是正確的答案,但如果有人遇到同樣的問題,我希望它會有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/484249.html
下一篇:Bash密碼驗證器
