我正在测试silex、mongodb和 Form 验证。我在使用 MongoDB ODM 和之前的 middelware 时遇到了验证问题,无论它是否与安全相关。
我得到了一个文档,并在文档的一个字段上添加了唯一约束。
如果在验证实际执行之前未请求文档,则一切正常。
假设我有一个 before 中间件,它在执行带有验证的控制器之前请求文档。在这种情况下,唯一约束不能正常工作,并显示一条错误消息,指出This value is already used。但它不应该,因为使用的值对于被验证的对象是唯一的。
总而言之,问题是,在验证字段上具有唯一约束的文档时,如果在实际执行验证代码之前通过文档管理器请求文档(未对文档进行任何修改),则似乎唯一约束不能正常工作。
我将设置一个测试用例,但与此同时,这里是我如何设置文档验证的示例;如果有人遇到过这个问题,请告诉我。
namespace Document;
//use Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique as MongoDBUnique;
use Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Mapping\ClassMetadata;
/**
* @ODM\Document(collection="blog_post")
*/
class Post
{
/**
* @ODM\Id
*
*/
protected $id;
/**
* @ODM\String
* @ODM\UniqueIndex
*/
protected $title;
/**
* @ODM\String
*/
protected $body;
/**
* @ODM\Date
*/
protected $createdAt;
/**
* @ODM\ReferenceOne(targetDocument="Document\User",cascade="update,merge",inversedBy="posts")
*/
protected $user;
function __construct() {
}
public function getTitle() {
return $this->title;
}
public function setTitle($title) {
$this->title = $title;
}
public function getBody() {
return $this->body;
}
public function setBody($body) {
$this->body = $body;
}
public function getCreatedAt() {
return $this->createdAt;
}
public function setCreatedAt($createdAt) {
$this->createdAt = $createdAt;
}
public function getId() {
return $this->id;
}
function getUser() {
return $this->user;
}
function setUser(User $user) {
$this->user = $user;
$this->user->addPost($this);
}
function __toString() {
return $this->title;
}
static function loadValidatorMetadata(ClassMetadata $metadatas) {
$metadatas->addPropertyConstraint("body", new Length(array('min'=>10,'max'=>1000)));
$metadatas->addPropertyConstraint("title", new Length(array('min'=>5,'max'=>255)));
$metadatas->addConstraint(new Unique(array('fields' => 'title')));
}
}
该应用程序位于此 Github 存储库中。(工作正在进行中):
编辑 1:之前中间件的一个示例,它会触发唯一约束的不稳定行为(在demo/mongoddb/blog/app/Config.php
链接的 repo 中的文件中):
$app['must_be_post_owner'] = $app->protect(function(Request $req)use($app) {
$postId = $req->attributes->get('id');
$user = $app['security']->getToken()->getUser();
$post = $app['odm.dm']->getRepository('Document\Post')->findOneBy(array('id' => $postId));
if ($post->getUser() !== $user) {
$app['logger']->alert("Access denied for user $user to post with id $postId ");
$app->abort(500, 'You cant access this resource !');
}
}
);
编辑 2:我尝试使用 XDebug 调试 Symfony/Doctrine-Bridge UniqueEntityValidator 类,但每次在单步调试期间执行 MongoDB 相关函数时都会出现套接字错误。