我正在使用Silex,并希望在MongoDB文档上应用唯一性验证器约束。
在symfony/doctrine-bridge
中发现的UniqueEntity
验证器约束不是设计用于doctrine/mongodb-odm
,而是仅用于ORM,因为SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity
中定义的服务是doctrine.orm.validator.unique
。
然而,在Symfony中,doctrine/mongodb-odm-bundle
中有一个Unique
约束验证器可以用于此目的。
我必须移植bundle的代码吗?有解决方案吗?
我找到了一个使用Saxulum Doctrine MongoDb提供商的解决方案:
1 -创建唯一的文档约束
# file: /src/MySilexApplication/Constraint/UniqueDocument.php
namespace MySilexApplicationConstraint;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;
/**
* Constraint for the unique document validator
*
* @Annotation
*/
class UniqueDocument extends UniqueEntity
{
public $service = 'doctrine_odm.mongodb.unique';
}
2 -在Doctrine注释注册中心
注册约束# file: /app/bootstrap.php
DoctrineCommonAnnotationsAnnotationRegistry::registerFile(
'/src/MySilexApplication/Constraint/UniqueDocument.php'
);
3 -使用和注册Saxulum提供程序(参见Github上的参数声明文档)
# file: /app/bootstrap.php
use SaxulumDoctrineMongoDbSilexProviderDoctrineMongoDbProvider;
use SaxulumDoctrineMongoDbOdmSilexProviderDoctrineMongoDbOdmProvider;
use SaxulumDoctrineMongodbOdmManagerRegistrySilexProviderDoctrineMongodbOdmManagerRegistryProvider;
$app->register(new DoctrineMongoDbProvider(), $params['mongodb']));
$app->register(new DoctrineMongoDbOdmProvider(), $params['mongodb_odm']);
$app->register(new DoctrineMongodbOdmManagerRegistryProvider());
4 -将约束验证器引用到Silex验证器服务提供者中,并将其声明为Silex服务
# file: /app/bootstrap.php
use SilexProviderValidatorServiceProvider;
$app->register(new ValidatorServiceProvider(), array(
'validator.validator_service_ids' => array(
'doctrine_odm.mongodb.unique' => 'doctrine_odm.mongodb.unique',
)
));
$app['doctrine_odm.mongodb.unique'] = $app->share(function (Application $app) {
return new SymfonyBridgeDoctrineValidatorConstraintsUniqueEntityValidator($app['doctrine']);
});
最后,使用它到你的文档类
# file: /src/MySilexApplication/Document/Bar.php
namespace MySilexApplicationDocument;
use DoctrineODMMongoDBMappingAnnotations as MongoDB;
use MySilexApplicationConstraintUniqueDocument as UniqueDocument;
/**
* @MongoDBDocument(collection="Foo")
*
* @UniqueDocument(fields={"baz"})
*/
class Bar
{
/**
* @var string
*
* @MongoDBString
*/
protected $baz;
...
}
如果有人知道更好的方法…
我不知道更低的版本,但对于Symfony 4.4,它足以覆盖service
参数为doctrine_odm.mongodb.unique
:
@UniqueEntity(fields={"baz"}, service="doctrine_odm.mongodb.unique")
在Symfony中,您可以使用此注释(或属性)代替5.4:
use DoctrineBundleMongoDBBundleValidatorConstraintsUnique As UniqueEntity;
它只是扩展Unique实体并将服务设置为mongoDb,仅此而已。