Rules
Rules neboli pravidla slouží k validaci dat při ukládání přes API a přes formuláře v datagridu.
Příklad využití rules
Předpokládejme, že chceme vytvořit nový článek. Článek má pět atributů: title, content, slug, source_url
a authorName Atribut title je povinný, content musí mít minimálně 10 znaků, slug musí být unikátní a ve
formátu [a-z0-9-], source_url musí být validní URL a authorName může být null nebo string.
Demonstraci si provedeme na PureField, který neobsahuje žádná přednastavená pravidla, formátery ani serializéry.
public function create(WriteBuilder $builder, CollectionRequest $request): WriteBuilder
{
return $builder
->add(new PureField(
key: 'title',
name: 'Titulek',
rules: [
new StringRule(),
new RequiredRule()
]
))
->add(new PureField(
key: 'content',
name: 'Obsah',
rules: [
new StringRule(),
new MinRule(10)
]
))
->add(new PureField(
key: 'slug',
name: 'Slug',
rules: [
new RegexRule(
pattern: '/^[a-z0-9]+(-[a-z0-9]+)*$/',
message: 'Slug musí obsahovat pouze malá písmena, číslice a pomlčku.'
),
// Namísto regexu lze rovnou použít
// new SlugRule(),
new UniqueRule(
targetEntity: Article::class,
columnName: 'slug',
message: 'Tento slug je již použit.'
),
]
))
->add(new PureField(
key: 'source_url',
name: 'Zdrojová URL',
rules: [
new UrlRule()
]
))
->add(new PureField(
key: 'authorName',
name: 'Autor',
rules: [
new StringRule()
new NullableRule(),
]
))
;
}
Přehled pravidel
| Rule (název třídy) | Popis | Parametry | |
|---|---|---|---|
| 1 | AnyOfRule | Ověří, zda hodnota patří do pole povolených hodnot. | array $keys ?string $message |
| 2 | ArrayRule | Ověří, zda hodnota je array. | ?string $message |
| 3 | BooleanRule | Ověří, zda hodnota je boolean. | ?string $message |
| 4 | CallableRule | Umožňuje definovat vlastní callback funkci pro validaci hodnoty. | callable $callback ?string $message |
| 5 | DateCzRule | Ověří, zda je hodnota ve formátu j.n.Y. | ?string $message |
| 6 | DateRule | Ověří, zda je hodnota ve formátu Y-m-d. | ?string $message |
| 7 | DateTimeCzRule | Ověří, zda je hodnota ve formátu j.n.Y H:i:s. | ?string $message |
| 8 | DateTimeIntervalRule | Ověří, zda je hodnota ve formátu Y-m-d H:i:s Y-m-d H:i:s. | ?string $message |
| 9 | DateTimeRule | Ověří, zda je hodnota ve formátu Y-m-d H:i:s. | ?string $message |
| 10 | DateTimeZoneRule | Ověří, zda se jedná o array{datetime: Y-m-d H:i:s, zone: Zone/Name}. | ?string $message |
| 11 | DecimalRule | Ověří, zda je hodnota desetinné číslo. | ?string $message |
| 12 | EmailRule | Ověří, zda je hodnota validní e-mailová adresa. | ?string $message |
| 13 | EqualRule | Ověří, zda je hodnota shodná s hodnotu v jiném fieldu. | string $targetField ?string $message |
| 14 | HourMinuteCzRule | Ověří, zda je hodnota ve formátu G:i. | ?string $message |
| 15 | HourMinuteRule | Ověří, zda je hodnota ve formátu H:i. | ?string $message |
| 16 | IntegerRule | Ověří, zda je hodnota celé číslo. | ?string $message |
| 17 | JsonRule | Ověří, zda je hodnota validní JSON. Parametr $schema umožňuje definici validačního schéma viz ukázka zde. | ?Schema $schema ?string $message |
| 18 | JsonStringRule | Ověří, zda je hodnota validní JSON string. Parametr $schema umožňuje definici validačního schéma viz ukázka zde. | ?Schema $schema ?string $message |
| 19 | MaxRule | V případě array ověří, zda array nepřesahuje maximální počet prvků. V případě stringu ověří, zda string nepřesahuje maximální délku. V případě čísla ověří, zda číslo nepřesahuje maximum. | int $max ?string $message |
| 20 | MinRule | V případě array ověří, zda array obsahuje alespoň minimální počet prvků. V případě stringu ověří, zda string není kratší než minimální délka. V případě čísla ověří, zda číslo není menší mež minimum. | int $min ?string $message |
| 21 | NullableRule | Povolí hodnotu null. | |
| 22 | NumericRule | Ověří, zda je hodnota celé nebo desetinné číslo. | ?string $message |
| 23 | PhoneCzRule | Ověří, zda je hodnota validní české telefonní číslo. Po validaci se (by default) provede i normalizace hodnoty. | bool $normalize ?string $message |
| 24 | RegexRule | Ověří, zda hodnota splňuje regulární výraz. | string $expression ?string $message |
| 25 | RequiredRule | Ověří, zda je pole vyplněno. | ?string $message |
| 26 | SlugRule | Ověří, zda je hodnota validní slug /^[a-z0-9]+(-[a-z0-9]+)*$/. | ?string $message |
| 27 | StringRule | Ověří, zda je hodnota řetězec. | ?string $message |
| 28 | TimeCzRule | Ověří, zda je hodnota ve formátu G:i:s. | ?string $message |
| 29 | TimeRule | Ověří, zda je hodnota ve formátu H:i:s. | ?string $message |
| 30 | UniqueRule | Ověří, zda je hodnota unikátní v databázi. | string $targetEntity string $columnName string $primaryKey ?string $message |
| 31 | UrlRule | Ověří, zda je hodnota validní URL. | ?string $message |
| 32 | VideoLinkRule | Ověří, zda je hodnota validní odkaz na Youtube nebo Vimeo video. Po validaci se (by default) provede i normalizace hodnoty. | bool $normalize ?string $message |
Vlastní pravidlo
Pokud potřebujete ovlivnit validaci nějakých hodnot jiným způsobem než nabízí výše uvedená pravidla, můžete si vytvořit vlastní pravidlo.
Vytvoření pravidla
Stačí přidat novou třídu, která podědí BaseRule a implementuje metodu validate().
class MyCustomRule extends BaseRule
{
/**
* @param class-string $targetEntity
*/
public function __construct(
protected string $targetEntity,
protected string $columnName,
protected string $primaryKey = 'id',
protected ?string $message = null
)
{
parent::__construct($message);
}
public function message(): string
{
return $this->message ?: "Value must be unique";
}
/**
* Return true if validation is passed
* @return bool
* @throws \Doctrine\ORM\NonUniqueResultException
* @throws \Megio\Collection\Exception\InvalidArgumentException
*/
public function validate(): bool
{
$value = $this->getValue();
if (!is_string($value) && !is_numeric($value) && !is_bool($value)) {
return false;
}
$repo = $this->getEntityManager()->getRepository($this->targetEntity);
$row = $repo->createQueryBuilder('e')
->select('e')
->where("e.{$this->columnName} = :value")
->setParameter('value', $this->getValue())
->getQuery()
->getOneOrNullResult(AbstractQuery::HYDRATE_ARRAY);
if ($row === null) {
return true;
}
if (!array_key_exists($this->primaryKey, $row)) {
throw new InvalidArgumentException(
"Property '{$this->primaryKey}' not found in entity '{$this->targetEntity}'"
);
}
if (
$row
&& $row[$this->columnName] === $this->getValue()
&& $row[$this->primaryKey] === $this->getBuilder()->getRowId()
) {
return true;
}
return false;
}
}
Povinné parametry konstruktoru
Jediným povinným parametrem je message, který určuje, jaká chybová zpráva se má zobrazit, pokud hodnota neprojde
validací.