tobias / zend-validator-doctrine
使用 Zend\Validator 验证 doctrine 实体
Requires
- php: ^7.3
- doctrine/persistence: ^1.0
- psr/container: ^1.0
- zendframework/zend-validator: ^2.9
Requires (Dev)
- phpunit/phpunit: ^8.2
- squizlabs/php_codesniffer: ^3.4
This package is auto-updated.
Last update: 2020-02-01 19:22:39 UTC
README
受著名的 DoctrineModule 启发并基于此。
此软件包提供了三个开箱即用的验证器: Tobias\Zend\Validator\Doctrine\ObjectExists 和 Tobias\Zend\Validator\Doctrine\NoObjectExists 分别实现了检查实体是否存在于数据库中的功能,以及 Tobias\Zend\Validator\Doctrine\UniqueObject 实现了检查值是否只在一个对象中使用的功能。它们的行为与其他任何标准 Zend 验证器类似。
所有三个验证器都接受以下选项
object_repository: 对象存储库的实例。fields: 包含用于检查实体是否存在(或不存在)的所有字段的数组。
Tobias\Zend\Validator\Doctrine\UniqueObject 还需要以下选项
object_manager: 对象管理器的实例。
关于 use_context 选项和其他关于 Tobias\Zend\Validator\Doctrine\UniqueObject 的具体信息,请参阅以下内容。
提示:要从对象管理器获取对象存储库,您需要调用任何有效对象管理器实例的
getRepository函数,传入类的完全限定名称(FQCN)。例如,在 Doctrine 2 ORM 的上下文中,以下是获取 'Application\Entity\User' 实体的object_repository的方法
$repository = $entityManager->getRepository('Application\Entity\User');
简单用法
您可以通过以下方式直接实例化验证器
$validator = new \Tobias\Zend\Validator\Doctrine\ObjectExists([ 'object_repository' => $objectManager->getRepository('Application\Entity\User'), 'fields' => ['email'], ]); var_dump($validator->isValid('test@example.com')); // dumps 'true' if an entity matches var_dump($validator->isValid(['email' => 'test@example.com'])); // dumps 'true' if an entity matches
与 Zend Framework 2 表单一起使用
当然,验证器与表单配合使用特别有用。要将 NoObjectExists 验证器添加到 Zend Framework 表单元素中
namespace Application\Form; use Tobias\Zend\Validator\Doctrine\NoObjectExists as NoObjectExistsValidator; use Zend\Form\Form; use Zend\ServiceManager\ServiceManager; use Application\Entity; class User extends Form { public function __construct(ServiceManager $serviceManager) { parent::__construct('my-form'); // Add an element $this->add([ 'type' => 'Zend\Form\Element\Email', 'name' => 'email', 'options' => [ 'label' => 'Email', ], 'attributes' => [ 'required' => 'required', ], ]); // add other elements (submit, CSRF…) // Fetch any valid object manager from the Service manager $entityManager = $serviceManager->get('doctrine.entitymanager.orm_default'); // Now get the input filter of the form, and add the validator to the email input $emailInput = $this->getInputFilter()->get('email'); $noObjectExistsValidator = new NoObjectExistsValidator([ 'object_repository' => $entityManager->getRepository(Entity\User::class), 'fields' => 'email', ]); $emailInput ->getValidatorChain() ->attach($noObjectExistsValidator); } }
如果您使用字段集,可以直接使用数组表示法添加验证器。例如,在 getInputFilterSpecification 函数中,如下所示
namespace Application\Form; use Zend\Form\Fieldset; use Zend\InputFilter\InputFilterProviderInterface; use Zend\ServiceManager\ServiceManager; use Application\Entity; class UserFieldset extends Fieldset implements InputFilterProviderInterface { protected $serviceManager; public function __construct(ServiceManager $serviceManager) { $this->serviceManager = $serviceManager; parent::__construct('my-fieldset'); // Add an element $this->add([ 'type' => 'Zend\Form\Element\Email', 'name' => 'email', 'options' => [ 'label' => 'Email', ], 'attributes' => [ 'required' => 'required', ], ]); } public function getInputFilterSpecification() { $entityManager = $this->serviceManager->get('doctrine.entitymanager.orm_default'); return [ 'email' => [ 'validators' => [ [ 'name' => 'Tobias\Zend\Validator\Doctrine\NoObjectExists', 'options' => [ 'object_repository' => $entityManager->getRepository(Entity\User::class), 'fields' => 'email', ], ], ], ], ]; } }
您可以通过以下方式更改验证器的默认消息
// For NoObjectExists validator (using array notation) : 'validators' => [ [ 'name' => 'Tobias\Zend\Validator\Doctrine\NoObjectExists', 'options' => [ 'object_repository' => $this->getEntityManager()->getRepository('Application\Entity\User'), 'fields' => 'email', 'messages' => [ 'objectFound' => 'A user with this email already exists.', ], ], ], ], // For ObjectExists validator (using object notation) : $objectExistsValidator = new \Tobias\Zend\Validator\Doctrine\ObjectExists([ 'object_repository' => $entityManager->getRepository('Application\Entity\User'), 'fields' => 'email', ]); **$objectExistsValidator->setMessage('noObjectFound', 'Email was not found.');**
UniqueObject
使用 Tobias\Zend\Validator\Doctrine\UniqueObject 时,您需要考虑两个问题;如上所述,您必须将 ObjectManager 作为 object_manager 选项传递,其次您必须为实体中具有的每个标识符传递一个值。
- 如果您省略了
use_context选项或将它设置为false,您必须将包含fields和identifier值的数组传递给isValid()。当使用Zend\Form时,如果您使用字段集,则需要此行为。 - 如果您将
use_context选项设置为true,您必须将fields值作为第一个参数传递,并将包含identifier值的数组作为第二个参数传递给isValid()。当在不使用字段集的情况下使用Zend\Form时,则需要此行为。
重要:无论您选择哪种方式,请确保 identifier 值的命名方式是字段名,而不是数据库列名。