To już ostatnia reguła jaką dopisujemy – długość maksymalna tekstu. Później dodamy autoloading. Do dzieła.
Na początek nasz ostatni projekt:
<?php
/*
$form_rules = [
'email' => ['required', 'email'],
'password' => ['required'],
'confirmPassword' => ['required', 'match:password'],
'name' => ['unique:people.name', 'maxLength:20'],
'country' => ['in:USA,Poland'],
'age' => ['min:18']
];
*/
$form_data = [
'email' => 'john.doe@gmail.com',
'password' => md5('helloworld'),
'confirmPassword' => md5('helloworld'),
'name' => 'Janet',
'country' => 'USA',
'age' => 19
];
interface RuleInterface
{
public function validate(array $data, string $field, array $params): bool;
public function getMessage(array $data, string $field, array $params): string;
}
Teraz dopisujemy klasę:
class LengthMaxRule implements RuleInterface
{
public function validate(array $data, string $field, array $params): bool
{
if (empty($params[0])) {
throw new InvalidArgumentException('Maximum length not specified');
}
$length = (int) $params[0];
return strlen($data[$field]) < $length;
}
public function getMessage(array $data, string $field, array $params): string
{
return "Exceeds maximum character limit of {$params[0]} characters";
}
}
Teraz symulacja parsowania naszych reguł i sprawdzenie, czy klasa działa:
$field = 'name';
$rule = new LengthMaxRule;
$params = array_slice(explode(":", "maxLength:2"), 1);
$len = $rule->validate($form_data, $field, $params);
if(!$len){
echo $rule->getMessage($form_data, $field, $params);
}
//Exceeds maximum character limit of 2 characters
Teraz zwiększamy maksimum długości tekstu i wiadomość o błędzie znika:
$field = 'name';
$rule = new LengthMaxRule;
$params = array_slice(explode(":", "maxLength:20"), 1);
$len = $rule->validate($form_data, $field, $params);
if(!$len){
echo $rule->getMessage($form_data, $field, $params);
}
W następnej lekcji zaczniemy parsowanie reguł na razie wykomentowanych.