如何使用 Silex 和 Doctrine MongoDB ODM 应用唯一验证器约束?
How to apply a unique validator constraint using Silex and Doctrine MongoDB ODM?
我正在使用 Silex 并想在 MongoDB 文档上应用唯一性验证器约束。
symfony/doctrine-bridge
中的 UniqueEntity
验证器约束并非设计用于 doctrine/mongodb-odm
,而是仅用于 ORM,因为 Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity
中定义的服务是doctrine.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 - 最后,将其用于您的文档 class
# 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")
我正在使用 Silex 并想在 MongoDB 文档上应用唯一性验证器约束。
symfony/doctrine-bridge
中的 UniqueEntity
验证器约束并非设计用于 doctrine/mongodb-odm
,而是仅用于 ORM,因为 Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity
中定义的服务是doctrine.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 - 最后,将其用于您的文档 class
# 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")