noahlvb / valueobject-bundle
Symfony 集成我的值对象包
v2.0.0
2022-04-30 20:14 UTC
Requires
- php: ^8.0
- doctrine/dbal: ^2.10
- noahlvb/valueobject: ^1.0
- symfony/form: ^6.0
- symfony/validator: ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- phpunit/phpunit: ^9.0
- squizlabs/php_codesniffer: ^3.5
README
Symfony 集成我的值对象包
安装
使用 composer,添加
$ composer require noahlvb/valueobject-bundle
运行测试
为了确保一切正常工作,您可以运行测试
$ make test
Doctrine DBAL
为了存储您自己的值对象,只需创建一个新的由 ValueObjectType 扩展的 doctrine 类型。同时将此新创建的类型添加到您的 doctrine 配置中。
class EmailAddressType extends ValueObjectType { public function getClassName(): string { return EmailAddress::class; } public function getName(): string { return 'email_address'; } }
doctrine: dbal: types: email_address: SoulSurvivor\Integration\Doctrine\Persistence\Type\ValueEmailAddressType
Symfony 表单
如果您想在 Symfony 表单中使用您的值对象,您应该创建一个新的表单类型,该类型扩展了 ValueObjectForm。然后在使用您自己的表单时使用该表单类型。
class EmailAddressForm extends ValueObjectForm { protected function getClassName(): string { return EmailAddress::class; } }
默认情况下,ValueObjectForm 将是一个 TextType。如果您想覆盖此并使其成为一个 EmailType 等,可以覆盖 getParent() 方法。
class EmailAddressForm extends ValueObjectForm { protected function getClassName(): string { return EmailAddress::class; } public function getParent() { return EmailType::class; } }
Symfony 验证器
默认情况下,ValeuObjectForm 将在验证表单时使用 ValueObjectConstraint(Validator)。这将使用值对象的内置 isValid() 方法。如果您想编写自己的验证消息或扩展验证器,可以这样做。
class EmailAddressConstraint extends ValueObjectConstraint { public $message = 'This email address is not valid.'; }
class EmailAddressConstraintValidator extends ValueObjectConstraintValidator { }
您需要创建一个空类并扩展 ValueObjectConstraintValidator。这是因为 Symfony 验证器根据类名匹配约束及其验证器。
最后,在您的表单类型中覆盖 getConstraintClassName(),使用您新创建的约束的类名。如下所示
class EmailAddressForm extends ValueObjectForm { protected function getConstraintClassName(): string { return EmailAddressConstraint::class; } }