Есть ли способ изменить поля ввода внутри класса запроса формы до проверки?
Я хочу изменить некоторые поля ввода даты следующим образом, но он, похоже, не работает.
Когда я устанавливаю поле ввода $this->start_dt
в 2016-02-06 12:00:00
и $this->end_dt
до 2016-02-06 13:00:00
я все еще получаю ошибку проверки «end_dt должен быть после start_dt» , Это означает, что значения входных запросов не изменяются при обновлении $this->start_dt
и $this->end_dt
внутри функции rules()
.
public function rules() { if ($this->start_dt){ $this->start_dt = Carbon::createFromFormat('d MYH:i:s', $this->start_dt . ' ' . $this->start_hr . ':'. $this->start_min . ':00'); } if ($this->end_dt){ $this->end_dt = Carbon::createFromFormat('d MYH:i:s', $this->end_dt . ' ' . $this->end_hr . ':'. $this->end_min . ':00'); } return [ 'start_dt' => 'required|date|after:yesterday', 'end_dt' => 'required|date|after:start_dt|before:' . Carbon::parse($this->start_dt)->addDays(30) ]; }
Примечание: start_dt
и end_dt
являются полями end_dt
даты, а start_hr
, start_min
– полями. Поэтому мне нужно создать дату-время, объединив все поля, чтобы я мог сравнивать.
Начиная с laravel 5.4 вы можете переопределить метод prepareForValidation
ValidatesWhenResolvedTrait
для изменения любого ввода. Что-то подобное должно быть возможно для laravel 5.1.
Пример в вашем запросе
/** * Modify the input values * * @return void */ protected function prepareForValidation() { // get the input $input = array_map('trim', $this->all()); // check newsletter if (!isset($input['newsletter'])) { $input['newsletter'] = false; } // replace old input with new input $this->replace($input); }
FormRequest имеет метод validationData (), который возвращает данные для проверки, поэтому я переопределяю его в запросе формы:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class MyClassRequest extends FormRequest { ... /** * Get data to be validated from the request. * * @return array */ public function validationData() { return array_merge( $this->all(), [ 'number' => preg_replace("/[^0-9]/", "", $this->number) ] ); } ... }
Он отлично работает, я использую Laravel 5.4 🙂
Вы можете сделать что-то вроде следующего:
public function rules(Request $request) { if ($request->has('start_dt')){ $request->replace('start_dt', Carbon::createFromFormat('d MYH:i:s', $request->start_dt . ' ' . $request->start_hr . ':'. $request->start_min . ':00')); } if ($request->has('end_dt')){ $request->replace('end_dt' ,Carbon::createFromFormat('d MYH:i:s', $request->end_dt . ' ' . $request->end_hr . ':'. $request->end_min . ':00')); } return [ 'start_dt' => 'required|date|after:yesterday', 'end_dt' => 'required|date|after:start_dt|before:' . Carbon::parse($request->start_dt)->addDays(30) ]; }