简体   繁体   English

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

[英]How to apply a unique validator constraint using Silex and Doctrine MongoDB ODM?

I'm using Silex and would like to apply uniqueness validator constraints on MongoDB documents. 我正在使用Silex,并且想在MongoDB文档上应用唯一性验证器约束。

The UniqueEntity validator constraint to be found in symfony/doctrine-bridge wasn't designed to work with doctrine/mongodb-odm but solely with the ORM since the service defined in Symfony\\Bridge\\Doctrine\\Validator\\Constraints\\UniqueEntity is doctrine.orm.validator.unique . UniqueEntity中发现的验证约束symfony/doctrine-bridge不是设计一起工作doctrine/mongodb-odm但仅限自定义的服务的ORM Symfony\\Bridge\\Doctrine\\Validator\\Constraints\\UniqueEntitydoctrine.orm.validator.unique

With Symfony however, there is a Unique constraint validator in the doctrine/mongodb-odm-bundle that can be used for this purpose. 但是,对于Symfony,在doctrine/mongodb-odm-bundle中有一个Unique约束验证器可用于此目的。

Do I have to port the code of the bundle? 我是否需要移植捆绑软件的代码? Any workaround? 任何解决方法?

I found a solution using Saxulum Doctrine MongoDb providers: 我找到了使用Saxulum Doctrine MongoDb提供程序的解决方案:

1 - Create the unique document constraint 1-创建唯一的文档约束

# file: /src/MySilexApplication/Constraint/UniqueDocument.php

namespace MySilexApplication\Constraint;

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * Constraint for the unique document validator
 *
 * @Annotation
 */
class UniqueDocument extends UniqueEntity
{
    public $service = 'doctrine_odm.mongodb.unique';
}

2 - Register the constraint in the Doctrine annotation registry 2-在Doctrine注释注册表中注册约束

# file: /app/bootstrap.php

\Doctrine\Common\Annotations\AnnotationRegistry::registerFile(
    '/src/MySilexApplication/Constraint/UniqueDocument.php'
);

3 - Use and register Saxulum providers (see documentation on Github for params declaration) 3-使用和注册Saxulum提供程序(请参阅Github上的文档以获取参数声明)

# file: /app/bootstrap.php

use Saxulum\DoctrineMongoDb\Silex\Provider\DoctrineMongoDbProvider;
use Saxulum\DoctrineMongoDbOdm\Silex\Provider\DoctrineMongoDbOdmProvider;
use Saxulum\DoctrineMongodbOdmManagerRegistry\Silex\Provider\DoctrineMongodbOdmManagerRegistryProvider;

$app->register(new DoctrineMongoDbProvider(), $params['mongodb']));
$app->register(new DoctrineMongoDbOdmProvider(), $params['mongodb_odm']);
$app->register(new DoctrineMongodbOdmManagerRegistryProvider());

4 - Reference the constraint validator into the Silex validator service provider and declare it as a Silex service 4-将约束验证器引用到Silex验证器服务提供程序中,并将其声明为Silex服务

# file: /app/bootstrap.php

use Silex\Provider\ValidatorServiceProvider;

$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 Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator($app['doctrine']);
});

5 - At last, use it into your document class 5-最后,将其用于文档类

# file: /src/MySilexApplication/Document/Bar.php

namespace MySilexApplication\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use MySilexApplication\Constraint\UniqueDocument as UniqueDocument;

/**
 * @MongoDB\Document(collection="Foo")
 *
 * @UniqueDocument(fields={"baz"})
 */
class Bar
{
    /**
     * @var string
     *
     * @MongoDB\String
     */
    protected $baz;

    ...
}

If someone knows a better way ... 如果有人知道更好的方法...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM