我有一些实体,但我想在db中验证最多X个条目。 例如,允许在DB中不超过5个类别。 我试着看看是否有一些约束验证解决了我的麻烦,但我没有发现任何有用的东西。 提前谢谢
答案 0 :(得分:0)
您可能需要自己实施。我没有看到任何这样的事情,但做一个属于你自己的并不困难。只需添加一个函数来检查数据库中有多少条目,并在插入任何内容之前调用此函数。
可以这样做:
public function newAction(){
$isAllowed = $this->checkMaxRecords();
if($isAllowed){
//save to the database
}
}
private function checkMaxRecords(){
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT c
FROM AcmeStoreBundle:Category c'
);
$category = $query->getResult();
if(count($category) >= 5){
return false;
}
return true;
}
这是未经测试的代码,但沿着这些方向的某些内容可以让您走上正确的轨道。
答案 1 :(得分:0)
如果您需要在多个地方验证您的实体或对多个实体类进行此类验证,您可以编写自定义验证约束来执行此操作。它确实有点像矫枉过正,但它在技术上是'正确'的解决方案。这在How to create a Custom Validation Constraint中的Symfony手册中有记录。例如:
约束类:
<?php
namespace Your\Bundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
class MaxEntries extends Constraint
{
public $message = 'The maximum %max% %name% entries already exist.';
public $max = 5;
public function validatedBy()
{
return 'maxEntries';
}
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
}
ConstraintValidator类:
<?php
namespace Your\Bundle\Validator\Constraints;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class MaxEntriesValidator extends ConstraintValidator
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function validate($protocol, Constraint $constraint)
{
/** @var MaxEntries $constraint */
$protocolClass = new \ReflectionClass(get_class($protocol));
$entityName = $protocolClass->getShortName();
// alternative to next 2 lines - you could use dql to do a select count
$repository = $this->entityManager->getRepository('YourBundle:' . $entityName);
$entities = $repository->findAll();
if (count($entities) == $constraint->max)
{
$this->context->addViolation($constraint->message, array(
'%max%' => $constraint->max,
'%name%' => $entityName,
));
}
}
}
services.yml:
validator.max_entries:
class: Bullitt\TargetNeutral\SpectatorBundle\Validator\Constraints\MaxEntriesValidator
arguments: [@doctrine.orm.entity_manager]
tags:
- { name: validator.constraint_validator, alias: maxEntries }
validation.yml:
Your\Bundle\YourEntity:
constraints:
- Your\Bundle\Validator\Constraints\MaxEntries:
# You can override the default constraint attributes here
message: "Failed! The maximum %max% %name% entries already exist."
max: 42
注意,您可能能够提出比MaxEntries更好的名称(我通常会花更多时间考虑最有意义的名称)。此外,验证程序类当前不包含将其应用于非逻辑实体的类的保护。