Die Validierungskomponente wird von brandbox genutzt um bspw. Datenbankobjekte vor dem Speichern in der Datenbank gegen bestimmte Kriterien (sog. Constraints) zu prüfen. Nur wenn alle Kriterien erfolgreich geprüft wurden wird das Objekt in der Datenbank abgespeichert.
Aufbau des Plugins
Dieses Plugin wird von brandbox base genutzt um Benutzereingaben direkt vor dem Speichern eines Datenbankobjektes zu prüfen. Dadurch wird jedes generalisierte Formular in der Administrationsoberfläche von brandbox automatisch validiert. Die zu prüfenden Kriterien (Constraints) müssen entweder im Programmcode bei einer Objekteigenschaft oder über die Datenmodellierung festgelegt werden.
Neue Kriterien von brandbox
Zusätzlich zu den von Symfony bereitgestellten Constraint-Klassen stellt brandbox die folgenden Constraints zur Verfügung.
Konfiguration
Validierungskriterien müssen entweder über den Programmcode oder die Datenmodellierung definiert werden. In allen Fällen ist die Syntax für ein Kriterium zu befolgen.
Kriterium(parameter="wert", parameter=wert)
Kriterien über die Datenmodellierung festlegen
Siehe die entsprechende Dokumentation der Datenmodellierung.
Kriterien über den Programmcode festlegen
Über den Programmcode können Kriterien pro Datenbankspalte oder für das gesamte Datenbankobjekt festgelegt werden. Für ein Kriterium welches für ein ganzes Datenbankobjekt gelten soll wird ein anderer Syntax genutzt.
<?php
/**
* In diesem Beispiel wird die Klasseneigenschaft $property
* mit drei Kriterien für die Validierung versehen.
*
* 1. NotBlank() erfordert einen gültigen Wert in $property.
* Werte welche null entsprechen sind verboten.
* 2. Length(...) erfordert das der Wert mindesten 3 und
* maximal 255 Zeichen umfassen darf.
* Ein Wert welcher null entspricht ist
* ohne NotBlank() ebenfalls gültig.
* 3. Regex(...) legt einen regulären Ausdruck fest welcher
* mit dem Wert von $property geprüft wird.
* Sollte der Wert null entsprechenden wird
* er ohne NotBlank() als gültig angesehen.
*/
namespace brandbox\sample\plugin\lib\entity {
use brandbox\component\doctrine;
/**
* [Deklaration als Doctrine-Entity]
*/
class sample extends doctrine\lib\entityAbstract {
/**
* @var string
*
* @constraint NotBlank()
* @constraint Length(min=3, max=255)
* @constraint Regex(pattern="/^[a-z]+$/Ui")
*
* [@Column...-Deklaration]
*/
public $property = 'example';
}
}
?>
<?php
/**
* In diesem Beispiel wird eine Validierungsmethode für das Datenbankobjekt definiert.
* Wird eine Validierung auf diesem Objekt ausgeführt wird die Methode callback() aufgerufen.
* Dort findest eine speziell für dieses Datenbankobjekt erforderliche Prüfung statt.
* Im Fehlerfall wird eine entsprechende Fehlermeldung erzeugt.
*/
namespace brandbox\sample\plugin\lib\entity {
use brandbox\component\doctrine;
use /** @noinspection PhpUnusedAliasInspection */ Symfony\Component\Validator\Constraints;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* [Deklaration als Doctrine-Entity]
*/
class sample extends doctrine\lib\entityAbstract {
/**
* @var string
*
* [@Column...-Deklaration]
*/
public $username;
/**
* @var string
*
* [@Column...-Deklaration]
*/
public $password;
/**
* @var string
*
* [@Column...-Deklaration]
*/
public $email;
/**
* @Constraints\Callback
*
* @param ExecutionContextInterface $context
*
* @return void
*/
public function callback($context) {
$required = $this->username . '@example.com';
if(0 !== strcmp($required, $this->email)):
$context
->buildViolation('You must provide a correct email address.')
->atPath('email')
->addViolation()
;
endif;
}
}
}
?>
Verwendung
Hauptsächlich wird dieses Plugin genutzt um Datenbankobjekte zu validieren. Es kann allerdings auch auf andere Klassenobjekte angewendet werden. Um ein Objekt zu validieren kann folgender Code genutzt werden.
<?php
namespace brandbox\sample\plugin\lib\execute {
use brandbox\admin\plugin;
use brandbox\component\http;
use brandbox\component\doctrine;
use brandbox\component\validator;
/**
* @author Max Mustermann <mustermann@example.com>
*/
class example extends plugin\lib\executeAbstract {
use validator\validatorTrait;
/**
* @param doctrine\lib\entityAbstract $entity
*
* @return http\response\responseAbstract
*/
public function execute($entity) {
$locale = $this->getApplicationLanguage();
return $this->validateValue($entity, $locale, function() use ($entity) {
$entity->save();
return new http\response\location('http://example.com/');
});
}
}
}
?>