0

我正在使用 Silex,并希望对 MongoDB 文档应用唯一性验证器约束。

要在 中找到的UniqueEntity验证器约束symfony/doctrine-bridge并非旨在与 ORM 一起使用,doctrine/mongodb-odm而是仅与 ORM 一起使用,因为在中定义的服务Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntitydoctrine.orm.validator.unique.

然而,在 Symfony 中,有一个Unique约束验证器doctrine/mongodb-odm-bundle可用于此目的。

我必须移植捆绑包的代码吗?任何解决方法?

4

2 回答 2

0

我找到了一个使用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;

    ...
}

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

于 2015-10-26T14:31:00.180 回答
0

我不知道较低的版本,但对于 Symfony 4.4,将service参数覆盖为doctrine_odm.mongodb.unique

@UniqueEntity(fields={"baz"}, service="doctrine_odm.mongodb.unique")
于 2021-09-22T14:38:13.383 回答