2014-02-09 3 views
1
.

. Какова наилучшая практика, чтобы проверить, существуют ли сущностные поля до ее сохранения. Вот пример EntityЛучшая практика. Проверьте, существует ли сущность перед представлением

class Pile{ 
    /** 
    * @var \ABC\CoreBundle\Entity\Record 
    * 
    * @ORM\OneToMany(targetEntity="Record") 
    * 
    */ 
    private $records; 

    /** 
    * @var \CSC\CoreBundle\Entity\Project 
    * 
    * @ORM\ManyToOne(targetEntity="Project") 
    * 
    */ 
    private $project; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="Block", type="string", length=255) 
    */ 
    private $block; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="Type", type="string", length=255) 
    */ 
    private $type; 

} 

class Record{ 
    /** 
    * @var \CSC\CoreBundle\Entity\Pile 
    * 
    * @ORM\ManyToOne(targetEntity="Pile") 
    * 
    */ 
    private $records; 
} 

Есть два контроллера, которые обрабатывают CRUD ворса и отчеты. Для создания кучи не должно быть никаких повторяющихся полей [project, block, type]

В контроллерах записи я мог бы создать Pile вместе с Record.

Вот проблема, когда и когда я проверяю db, если создается аналогичный объект Pile? Что такое лучшая практика?

  1. Скопируйте и вставьте контрольный запрос в обоих контроллерах?
  2. Могу ли я использовать $ form-> valid() для выполнения любой проверки в классе PileType?
  3. Должен ли я использовать услугу и иметь оба контроллера для вызова услуги?
  4. Использовать предварительную установку в жизненном цикле лица?

Благодаря

ответ

3

Вы можете использовать пользовательские ограничения проверки в форме, так что $form->isValid() будет делать чек. Следуйте за этой документацией на странице How to create a Custom Validation Constraint, чтобы создать пользовательский валидатор, а затем ввести доктрину в нее для проверки.

ОБНОВЛЕНИЕ: Ну, я не знал, что существует UniqueEntity Ограничение уже включено в Symfony.

Чтобы придать доктрине сделать следующее:

services: 
    validator.unique.unique_pile: 
     class: ABC\CoreBundle\Validator\Constraints\UniquePileValidator 
     arguments: [@doctrine.orm.entity_manager] 
     tags: 
      - { name: validator.constraint_validator, alias: unique_pile } 

Класс валидатор может выглядеть следующим образом:

// src/ABC/CoreBundle/Validator/Constraints/UniquePileValidator.php 
namespace ABC\CoreBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\ConstraintValidator; 

class UniquePileValidator extends ConstraintValidator 
{ 
    protected $em; 

    function __construct($em) { 
     $this->em = $em; 
    } 

    public function validate($value, Constraint $constraint) 
    { 
     $repo = $this->em->getRepository('ABC\CoreBundle\Entity\Record'); 

     $duplicate_project = $repo->findByProject($value); 
     $duplicate_block = $repo->findByBlock($value); 
     $duplicate_type = $repo->findByType($value); 

     if ($duplicate_project || $duplicate_block || $duplicate_type) { 
      $this->context->addViolation(
       $constraint->message, 
       array('%string%' => $value) 
      ); 
     } 
    } 
} 

И быть полным, ограничение класса:

// src/ABC/CoreBundle/Validator/Constraints/ContainsAlphanumeric.php 
namespace ABC\CoreBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 

/** 
* @Annotation 
*/ 
class ContainsAlphanumeric extends Constraint 
{ 
    public $message = 'This Pile already exists!'; 

    public function validatedBy() 
    { 
     return 'unique_pile'; 
    } 
} 

Должен быть почти скопирован/скопирован ...

3

Следовательно, поля должны быть уникальными?

Если это так, то это очень просто: UniqueEntity

use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 
... 

/** 
* @ORM\Entity 
* @UniqueEntity(
*  fields={"project", "block", "type"} 
*) 
*/ 
class Pile{ 
    /** 
    * @var \ABC\CoreBundle\Entity\Record 
    * 
    * @ORM\OneToMany(targetEntity="Record") 
    * 
    */ 
    private $records; 

    /** 
    * @var \CSC\CoreBundle\Entity\Project 
    * 
    * @ORM\ManyToOne(targetEntity="Project") 
    * 
    */ 
    private $project; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="Block", type="string", length=255, unique=true) 
    */ 
    private $block; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="Type", type="string", length=255, unique=true) 
    */ 
    private $type; 

} 
Смежные вопросы