Přeskočit na hlavní obsah

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)PopisParametry
1AnyOfRuleOvěří, zda hodnota patří do pole povolených hodnot.array $keys
?string $message
2ArrayRuleOvěří, zda hodnota je array.?string $message
3BooleanRuleOvěří, zda hodnota je boolean.?string $message
4CallableRuleUmožňuje definovat vlastní callback funkci pro validaci hodnoty.callable $callback
?string $message
5DateCzRuleOvěří, zda je hodnota ve formátu j.n.Y.?string $message
6DateRuleOvěří, zda je hodnota ve formátu Y-m-d.?string $message
7DateTimeCzRuleOvěří, zda je hodnota ve formátu j.n.Y H:i:s.?string $message
8DateTimeIntervalRuleOvěří, zda je hodnota ve formátu Y-m-d H:i:s Y-m-d H:i:s.?string $message
9DateTimeRuleOvěří, zda je hodnota ve formátu Y-m-d H:i:s.?string $message
10DateTimeZoneRuleOvěří, zda se jedná o array{datetime: Y-m-d H:i:s, zone: Zone/Name}.?string $message
11DecimalRuleOvěří, zda je hodnota desetinné číslo.?string $message
12EmailRuleOvěří, zda je hodnota validní e-mailová adresa.?string $message
13EqualRuleOvěří, zda je hodnota shodná s hodnotu v jiném fieldu.string $targetField
?string $message
14HourMinuteCzRuleOvěří, zda je hodnota ve formátu G:i.?string $message
15HourMinuteRuleOvěří, zda je hodnota ve formátu H:i.?string $message
16IntegerRuleOvěří, zda je hodnota celé číslo.?string $message
17JsonRuleOvěří, zda je hodnota validní JSON.
Parametr $schema umožňuje definici validačního schéma viz ukázka zde.
?Schema $schema
?string $message
18JsonStringRuleOvěří, zda je hodnota validní JSON string.
Parametr $schema umožňuje definici validačního schéma viz ukázka zde.
?Schema $schema
?string $message
19MaxRuleV 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
20MinRuleV 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
21NullableRulePovolí hodnotu null.
22NumericRuleOvěří, zda je hodnota celé nebo desetinné číslo.?string $message
23PhoneCzRuleOvěří, zda je hodnota validní české telefonní číslo.
Po validaci se (by default) provede i normalizace hodnoty.
bool $normalize
?string $message
24RegexRuleOvěří, zda hodnota splňuje regulární výraz.string $expression
?string $message
25RequiredRuleOvěří, zda je pole vyplněno.?string $message
26SlugRuleOvěří, zda je hodnota validní slug /^[a-z0-9]+(-[a-z0-9]+)*$/.?string $message
27StringRuleOvěří, zda je hodnota řetězec.?string $message
28TimeCzRuleOvěří, zda je hodnota ve formátu G:i:s.?string $message
29TimeRuleOvěří, zda je hodnota ve formátu H:i:s.?string $message
30UniqueRuleOvěří, zda je hodnota unikátní v databázi.string $targetEntity
string $columnName
string $primaryKey
?string $message
31UrlRuleOvěří, zda je hodnota validní URL.?string $message
32VideoLinkRuleOvěří, 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().

app/Collection/Rule/MyCustomRule.php
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í.