我不明白为什么Doctrine的ODM Unique约束对我不起作用。
下面是一个带有 "标题 "属性的页面类,它需要在所有页面中是唯一的。
namespace App\Document;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique as MongoDBUnique;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use App\Repository\PageRepository;
use App\Document\Embeded\Section;
/**
* @ODM\Document(repositoryClass=PageRepository::class)
* @MongoDBUnique(fields="title")
*/
class Page
{
/** @ODM\Id() */
private $id;
/** @ODM\ReferenceOne(targetDocument=Site::class) */
private $site;
/** @ODM\Field(type="string")
* @ODM\UniqueIndex(order="asc")
*/
private $title;
// ...
在控制器中。$form->handleRequest($request)
被调用,后面是查询:如果($form->isSubmitted() && $form->isValid()
)
表格总是以有效的方式返回。ODM Unique约束似乎被忽略了。我也尝试添加一个自定义的验证约束,但遇到了同样的问题。
我是否需要添加任何额外的配置来使其工作?
Symfony表单在设计上只验证顶层对象。在本例中,页面类被附加到一个嵌入式表单中。
解决方法:在顶层对象中添加Symfony的@Valid()约束。
/** @ODM\ReferenceOne(targetDocument="App\Document\Page", cascade={"persist"}, orphanRemoval=true)
* @ODM\Index
* @Assert\Valid()
*/
private $page;