Я хочу проверить поле «цена» в Laravel.
Цена должна содержать только числа без (.) Или (,) и также не может начинаться с 0.
Например
2500 // Пройдено
02500 // Не удается
12.12 // Неудачи
12,12 / Неудачно
Правило, которое у меня есть сейчас, выглядит так:
'price' => 'required|integer|not_in:0',
Кажется, это работает с приведенным выше примером, но я этого не понимаю. Почему integer не позволяет что-то вроде 0123 с начальным нулем. Я просто хочу убедиться, что мое правило работает должным образом, и что я ничего не пропускаю.
Спасибо






Используйте правило регулярное выражение, чтобы не разрешать целое число с началом 0
'price' => 'required|integer|not_in:0|regex:^[1-9][0-9]+',
если вы не уверены в правиле «целое число», вы можете использовать проверку выражения регулярного выражения следующим образом:
'price' => 'required|regex:^[1-9][0-9]+|not_in:0',
У меня была такая же проблема, как и у вас, и с тех пор я всегда использовал проверку регулярного выражения для такого рода требований. Кроме того, он позволяет вам вернуть то же регулярное выражение, если вы хотите выполнить предварительную проверку с помощью js.
Вот функция laravel, позволяющая проверять целые числа:
public function validateInteger($attribute, $value)
{
return filter_var($value, FILTER_VALIDATE_INT) !== false;
}
Итак, это поведение PHP беспокоит самого себя. PHP сообщает нам вот что о FILTER_VALIDATE_INT:
Validates value as integer, optionally from the specified range, and converts to int on success.
PHP не устанавливает никакой другой информации о значении «0», но известно, что эта функция не учитывает числа, начинающиеся с «0».
Да, я могу легко использовать регулярное выражение и добавить его тоже, моя проверка внешнего интерфейса, но я хочу понять, почему правило laravels целое число не допускает ведущего нуля
Я использовал то же самое, но выдает ошибку preg_match (): конечный разделитель '^' не найден
@JagrutiMetaliya писать в отдельном массиве вместо трубы
Вы можете отформатировать ввод перед отправкой его валидатору в вашем классе Request.
public function formatInput()
{
$input = array_map('trim', $this->all());
$input['price'] = (int)($input['price']);
$this->replace($input);
return $this->all();
}
Тогда вы можете использовать
'price' => 'required|integer|min:0',
Надеюсь это поможет
Разве laravel не делает это из коробки с v5.4? Я думал о промежуточном программном обеспечении \ Illuminate \ Foundation \ Http \ Middleware \ TrimStrings :: class,laravel-news.com/laravel-5-4-middleware
@ user2722667 это просто пример, вы можете пропустить это
Это работает для меня:
'price' => 'required|numeric|gt:0',
Самое чистое решение
Это чисто, но что, если вы хотите согласиться с нулевой ценой
Затем добавьте gte: 0.
Да, я могу легко использовать регулярное выражение, но я хочу понять, почему правило laravels целое число не допускает ведущего нуля