$this->get('from'), 'rates' => $this->get('rates', []), ]; } public function getFromCurrency(): TransactionCurrency { return TransactionCurrency::where('code', $this->get('from'))->first(); } /** * The rules that the incoming request must be matched against. */ public function rules(): array { return [ 'from' => 'required|exists:transaction_currencies,code', 'rates' => 'required|array', 'rates.*' => 'required|numeric|min:0.0000000001', ]; } public function withValidator(Validator $validator): void { $from = $this->getFromCurrency(); $validator->after( static function (Validator $validator) use ($from): void { $data = $validator->getData(); $rates = $data['rates'] ?? []; if (0 === count($rates)) { $validator->errors()->add('rates', 'No rates given.'); return; } foreach ($rates as $key => $entry) { if ($key === $from->code) { $validator->errors()->add(sprintf('rates.%s', $key), trans('validation.convert_to_itself', ['code' => $key])); continue; } $to = TransactionCurrency::where('code', $key)->first(); if (null === $to) { $validator->errors()->add(sprintf('rates.%s', $key), trans('validation.invalid_currency_code', ['code' => $key])); } } } ); } }