簡體   English   中英

如何使用Silex和Doctrine MongoDB ODM應用唯一的驗證器約束?

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

我正在使用Silex,並且想在MongoDB文檔上應用唯一性驗證器約束。

UniqueEntity中發現的驗證約束symfony/doctrine-bridge不是設計一起工作doctrine/mongodb-odm但僅限自定義的服務的ORM Symfony\\Bridge\\Doctrine\\Validator\\Constraints\\UniqueEntitydoctrine.orm.validator.unique

但是,對於Symfony,在doctrine/mongodb-odm-bundle中有一個Unique約束驗證器可用於此目的。

我是否需要移植捆綁軟件的代碼? 任何解決方法?

我找到了使用Saxulum Doctrine MongoDb提供程序的解決方案:

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-在Doctrine注釋注冊表中注冊約束

# file: /app/bootstrap.php

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

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-將約束驗證器引用到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-最后,將其用於文檔類

# 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;

    ...
}

如果有人知道更好的方法...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM