Я беспокоюсь, что проверка не работает, когда я создаю новый объект "resa", но работает, если я изменяю существующий объект.
Я не могу найти, где он!
Моя сущность:
<?php
namespace Damias\ResaBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Damias\ResaBundle\Validator\Constraints as ResaAssert;
/**
* Reservation
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Damias\ResaBundle\Entity\ReservationRepository")
* @ResaAssert\ResaUnique
*/
class Reservation
{
...
Мое ограничение:
<?php
namespace Damias\ResaBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class ResaUnique extends Constraint
{
public $message = 'Réservation en conflit (chambre déjà occupée dans cette période)';
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
public function validatedBy()
{
return 'damiasresa_resaunique';
}
}
Мой валидатор:
<?php
namespace Damias\ResaBundle\Validator\Constraints;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class ResaUniqueValidator extends ConstraintValidator
{
private $requestStack;
private $em;
public function __construct(RequestStack $requestStack, EntityManagerInterface $em)
{
$this->requestStack=$requestStack;
$this->em=$em;
}
public function validate($value, Constraint $constraint)
{
$dateArrivee=clone $value->getDateArrivee();
$dateArrivee->modify('+1 day');
$dateDepart=clone $value->getDateDepart();
$dateDepart->modify('-1 day');
$ressources=$value->getRessources()->getValues();
$id_ressources=array();
foreach ($ressources as $ressource)
{
$id_ressources[]=$ressource->getId();
}
$autre_resa=$this ->em
->getRepository('DamiasResaBundle:Reservation')
->autreResa($id_ressources, $dateArrivee, $dateDepart);
if (count($autre_resa)>1)
{
$this->context ->buildViolation($constraint->message)
->atPath('Ressources')
->addViolation();
}
}
}
Мое действие редактирования, которое работает:
public function reservationAction($id)
{
// SESSION
$session = $this->get('session');
$em = $this ->getDoctrine()
->getManager();
$resa = $em ->getRepository('DamiasResaBundle:Reservation')->find($id);
$form_reservation = $this ->createForm(new ReservationType, $resa);
$request = $this->get('request');
if($request->getMethod()=='POST')
{
//Récupération de la Réservation - Modification
if($this ->get('request') ->get('damias_resabundle_reservation')!==null)
{
$form_reservation->handleRequest($request);
if ($form_reservation->isSubmitted() && $form_reservation-> isValid())
{
$em=$this->getDoctrine()->getManager();
$em->flush();
$date=$resa->getDateArrivee();
$session->set('date', $date);
$response = $this->redirect($this->generateUrl('damias_resa_homepage'));
return $response;
}
}
}
$response = $this->render(
'DamiasResaBundle:Default:reservation_edit.html.twig',
array(
'form_reservation' => $form_reservation->createView(),
'resa' => $resa
)
);
return $response;
}
Мое дополнительное действие, которое не учитывает валидацию:
public function ajouter_reservationAction()
{
// SESSION
$session = $this->get('session');
if ($session->get('resa')!=null) {
$resa = new Reservation($session->get('resa'));
}
else {
$resa = new Reservation();
}
$client = new Client();
$request = $this->get('request');
$form_client = $this ->createForm(new ClientType,$client);
$form_reservation = $this ->createForm(new ReservationType, $resa);
// Récupération des choix
if($request->getMethod()=='GET')
{
// Récupération de la date de début
if($this ->get('request') -> get('choix') !==null)
{
$choix=$this ->get('request') -> get('choix');
$date_arrivee=$choix['date_encours']['date'];
$date_arrivee = new \Datetime($date_arrivee);
$date_depart = clone $date_arrivee;
$date_depart->modify('+1 day');
$ressourceId=$choix['ressource'];
$em = $this ->getDoctrine()
->getManager();
$ressource = $em->getRepository('DamiasResaBundle:Ressource')->find($ressourceId);
$id_categories=$choix['categories'];
$resa ->setDateArrivee($date_arrivee)
->setDateDepart($date_depart)
->addRessource($ressource);
$session->set('resa', $resa);
$categories = $ressource->getCategories();
$form_reservation = $this ->createForm(new ReservationType, $resa);
}
}
// Récupération du formulaire
if($request->getMethod()=='POST')
{
// Récupération du nouveau client
if($this ->get('request') ->get('damias_resabundle_client')!==null)
{
if ($form_client->handleRequest($request)-> isValid())
{
$em=$this->getDoctrine()->getManager();
$em->persist($client);
$em->flush();
$resa->setClient($client);
$session->set('resa', $resa);
}
}
//Récupération de la Réservation
if($this ->get('request') ->get('damias_resabundle_reservation')!==null)
{
$form_reservation->handleRequest($request);
if ($form_reservation->isSubmitted() && $form_reservation-> isValid())
{
$em=$this->getDoctrine()->getManager();
$em->persist($resa);
$em->flush();
$date=$resa->getDateArrivee();
$session->set('date', $date);
$session->set('resa', null);
$response = $this->redirect($this->generateUrl('damias_resa_homepage'));
return $response;
}
}
}
$response = $this->render(
'DamiasResaBundle:Default:reservation_new.html.twig',
array(
'form_reservation' => $form_reservation->createView(),
'form_client' => $form_client->createView()
)
);
return $response;
}
Проверка выполняется хорошо, когда я изменяю существующий объект, он не работает в создании! Откуда это? Идея? трек?
Спасибо за вашу помощь И жаль насчет форматирования моего кода, это мой первый пост, и я не нашел, как это сделать (мне не очень нравится язык Шекспира)
Я нашел эти старые нерешенные вопросы на форуме... Моя ошибка была действительно глупой: в моем валидаторе у меня было:
if (count ($ autre_resa)> 1
то мне пришлось поставить:
if (count ($ autre_resa)> 0