2

我正在测试和 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 相关函数时都会出现套接字错误。

4

0 回答 0