如何使用Silex和Doctrine MongoDB ODM应用唯一的验证器约束



我正在使用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,仅此而已。

最新更新