Я использую проверку запроса формы и разрешаю создание транспортных средств в форме. Каждое транспортное средство имеет ссылку, которая может быть A, B, C или D. Однако в каждом запросе формы всегда должен быть один номер: «A». Других может быть сколько угодно.
Я не контролирую форму. Запросы поступают через API.
Мой массив правил в настоящее время содержит:
'form.vehicles' => 'required',
'form.vehicles.*.ref' => 'required|in:A,B,C,D
В настоящее время я использую следующий код:
if (! in_array('A', $this->input('form.vehicles.*.ref'))) {
throw new HttpResponseException(response()->json(['MessageString' => 'Vehicle ref A is required'], 422));
Однако это означает, что messageBag не может быть отправлен в ответе из-за других проблем с проверкой.
Спасибо за комментарий. Это делается с помощью FormRequest. Я воспользовался вашим предложением создать собственное правило, реализующее ValidationRule. $requiredVehicle = collect($value)->first(function ($vehicle) { return $vehicle['ref'] === 'A'; }); if ($requiredVehicle === null) { $fail('Vehicle A is required'); }
Я не могу создать ответ, но этот комментарий меня устраивает.
Отличный! Рад слышать, что у вас это работает 🙂 У вас должна быть возможность опубликовать ответ ниже (насколько мне известно, в Stackoverflow нет никаких ограничений на публикацию самостоятельного ответа, даже при 1 репутации), но в конечном итоге это более важно для вам, чтобы ваш код работал. Ваше здоровье!
Я использовал предложение Тима Льюиса о создании специального правила, реализующего ValidationRule:
namespace App\Rules;
use Illuminate\Contracts\Validation\ValidationRule;
class VehicleA implements ValidationRule
{
/**
* Run the validation rule.
*
* @param \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString $fail
*/
public function validate(string $attribute, mixed $value, Closure $fail): void
{
$requiredVehicle = collect($value)->first(function ($vehicle) {
return $vehicle['ref'] === 'A';
});
if ($requiredVehicle === null) {
$fail('Vehicle A is required');
}
}
Внутри моего запроса формы:
'form.vehicles' => [
'required',
new VehicleA,
],
Как вы проводите эту проверку? Это FormRequest, ручной валидатор или что-то еще? У вас должна быть возможность добавлять сообщения в Error MessageBage вместо выдачи исключения, но это зависит от вашего подхода, который вы здесь не показали. В качестве альтернативы вы можете определить собственное правило, которое проверяет
form.vehicles
на наличие записи, содержащейref: 'A'
, и использовать его как'form.vehicles' => ['required', new RefCheckRule()]
или аналогичное.