Как применить ограничение уникального валидатора, используя Silex и Doctrine MongoDB ODM?

Я использую Silex и хотел бы применить ограничения валидатора уникальности к документам MongoDB.

UniqueEntity ограничение валидатора можно найти в symfony/doctrine-bridge не был предназначен для работы с doctrine/mongodb-odm но исключительно с ORM, так как сервис, определенный в Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity является doctrine.orm.validator.unique,

С Symfony, однако, есть Unique Валидатор ограничения в doctrine/mongodb-odm-bundle которые могут быть использованы для этой цели.

Нужно ли переносить код пакета? Любое решение?

3 ответа

Решение

Я нашел решение, используя провайдеров 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;

    ...
}

Если кто-то знает лучший способ...

Не знаю, как насчет более низких версий, но для Symfony 4.4 достаточно перезаписать service параметр для doctrine_odm.mongodb.unique:

      @UniqueEntity(fields={"baz"}, service="doctrine_odm.mongodb.unique")

В Symfony вы можете использовать эту аннотацию (или атрибут), начиная с версии 5.4:

      use Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique As UniqueEntity;

Он просто расширяет объект Unique и устанавливает для службы значение mongoDb, не более того.

Другие вопросы по тегам