У PHP типова маніпуляція дозволяє "1"
сприйматися як булеве значення, а числові рядки – як цілі числа. Однак строгі параметри валідації Laravel вимагають точного відповідності типів для правил numeric
, boolean
та integer
.
У режимі без строгих перевірок ці валідації приймають значення, що були приведені до типу:
Validator::make(['count' => '42'], ['count' => 'numeric']); // проходить
Validator::make(['active' => '1'], ['active' => 'boolean']); // проходить
Обидва випадки проходять валідацію, хоч насправді це рядки, а не справжні типи.
З строгими параметрами потрібна точна відповідність типу:
use Illuminate\Support\Facades\Validator;
Validator::make(['count' => '42'], ['count' => 'numeric:strict']); // не проходить
Validator::make(['count' => 42], ['count' => 'numeric:strict']); // проходить
Validator::make(['active' => '1'], ['active' => 'boolean:strict']); // не проходить
Validator::make(['active' => true], ['active' => 'boolean:strict']); // проходить
Validator::make(['age' => '25'], ['age' => 'integer:strict']); // не проходить
Validator::make(['age' => 25], ['age' => 'integer:strict']); // проходить
API-інтерфейси, які обробляють конфігураційні дані, виграють від використання строгих перевірок типів:
public function updateSettings(Request $request)
{
$validator = Validator::make($request->all(), [
'notifications_enabled' => 'boolean:strict',
'items_per_page' => 'integer:strict',
'refresh_rate' => 'numeric:strict',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
$settings = $validator->validated();
if ($settings['notifications_enabled'] === true) {
$this->enableNotifications();
}
}
У випадку відсутності строгих перевірок, JSON-дані з рядковими значеннями, такими як {"notifications_enabled": "1", "items_per_page": "25"}
, проходять валідацію, однак викликають проблеми з типами в логіці програми.
Поведінка валідації типів відрізняється між режимами:
Validator::make(['foo' => '1'], ['foo' => 'numeric:strict']); // не проходить
Validator::make(['foo' => 1], ['foo' => 'numeric:strict']); // проходить
Validator::make(['foo' => 1.5], ['foo' => 'numeric:strict']); // проходить
Validator::make(['active' => true], ['active' => 'boolean:strict']); // проходить
Validator::make(['active' => false], ['active' => 'boolean:strict']); // проходить
Validator::make(['active' => 1], ['active' => 'boolean:strict']); // не проходить
Validator::make(['count' => 42], ['count' => 'integer:strict']); // проходить
Validator::make(['count' => '42'], ['count' => 'integer:strict']); // не проходить
Валідація в строгому режимі запобігає проблемам з приведенням типів, вимагаючи, щоб значення відповідали очікуваному типу PHP абсолютно, а не просто могли бути перетвореними до нього