2016-04-19 12 views
1

Ich arbeite an einem Login & Registrierungsformular wo auf der Homepage muss ich dem Benutzer zwei Optionsfeldoptionen für die Auswahl von zwei Ereignissen (in den Variablen eT1 und eT2 gespeichert) zur Verfügung stellen. Allerdings muss ich sicherstellen, dass das Maxlimit eines bestimmten Ereignisses nicht voll ist, dh. Wenn der Benutzer ein Ereignis auswählt, dessen Maxlimit voll ist, muss eine Fehlermeldung angezeigt werden. * Ich brauche diese Validierungslogik im Controller. * Für die Anmeldung und Registrierung Ich bin mit FOSUserBundleSymfony2 Validierungseinschränkungen

Hier ist der Controller-Code

<?php 

namespace AppBundle\Controller; 

use AppBundle\Entity\events; 
//use AppBundle\Entity\eventtype; 
use AppBundle\Entity\users; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 

class DefaultController extends Controller { 

    /** 
    * @Route("/home", name="homepage") 
    */ 
    public function indexAction(Request $request) { 
     $events = new events(); 

     $form = $this->createFormBuilder($events) 
       ->add('eT1', ChoiceType::class, array(
        'choices' => array(
         'Poker' => 1, 
         'Chess' => 2, 
         'Cricket' => 3, 
         'Marbles' => 4, 
         'Football' => 5, 
        ), 
        'choices_as_values' => true, 
        'expanded' => true, 
        'multiple' => false, 
        'label' => 'Choose After Breakfast Event', 
       )) 
       ->add('eT2', ChoiceType::class, array(
        'choices' => array(
         'Poker' => 1, 
         'Chess' => 2, 
         'Cricket' => 3, 
         'Marbles' => 4, 
         'Football' => 5, 
        ), 
        'choices_as_values' => true, 
       'expanded' => true, 
        'multiple' => false, 
        'label' => 'Choose After Snacks Event', 
        )) 
       ->add('save', SubmitType::class, array('label' => 'Submit')) 
       ->getForm(); 

     if ($request->isMethod('POST')) { 
      $form->submit($request); 


      if ($form->isValid()) { 
       // perform some action, eg. persisting the data to database... 
       $user = $this->container->get('security.context')->getToken()->getUser(); 
       $events->setuser($user); 
//    var_dump($id); 
//    exit; 
       //$events->setuserID($id); 


       $em = $this->getDoctrine()->getManager(); 

       // tells Doctrine you want to (eventually) save the Product (no queries yet) 
       $em->persist($events); 

       // actually executes the queries (i.e. the INSERT query) 
       $em->flush(); 
       return $this->redirectToRoute('homepage'); 
      } 
     } 

     return $this->render('default/index.html.twig', array(
        'form' => $form->createView(), 
     )); 
    } 
} 

unterhalb der Benutzer Entität

<?php 

namespace AppBundle\Entity; 

use FOS\UserBundle\Model\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* users 
* 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\usersRepository") 
*/ 
class users extends BaseUser 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

     /** 
    * Get id 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * @ORM\OneToMany(targetEntity="events", mappedBy="users") 
    */ 
    protected $multiEvents; 


    public function __construct() 
    { 
     parent::__construct(); 
     // your own logic 
     $this->multiEvents = new ArrayCollection(); 
     //$this->id = $id; 
     //$this->name = $name; 
     } 

    } 

unterhalb der Ereignisse Einheit wird

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* events 
* 
* @ORM\Table(name="events") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\eventsRepository") 
*/ 
class events { 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="user_id", type="integer") 
    */ 
    protected $user_id; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="ET1", type="integer") 
    */ 
    protected $eT1; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="ET2", type="integer") 
    */ 
    protected $eT2; 

    /** 
    * @ORM\ManyToOne(targetEntity="users", inversedBy="multievents") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $singleUser; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() { 
     return $this->id; 
    } 

    /** 
    * Get user_id 
    * 
    * @return integer 
    */ 
    public function getuser_id() { 
     return $this->user_id; 
    } 

    /** 
    * Set user 
    * 
    * @param integer $user 
    * @return events 
    */ 
    public function setUser($user) { 
     $this->singleUser = $user; 
    } 


    /** 
    * Set eT1 
    * 
    * @param integer $eT1 
    * @return events 
    */ 
    public function setET1($eT1) { 
     $this->eT1 = $eT1; 

     return $this; 
    } 

    /** 
    * Get eT1 
    * 
    * @return integer 
    */ 
    public function getET1() { 
     return $this->eT1; 
    } 

    /** 
    * Set eT2 
    * 
    * @param integer $eT2 
    * @return events 
    */ 
    public function setET2($eT2) { 
     $this->eT2 = $eT2; 

     return $this; 
    } 

    /** 
    * Get eT2 
    * 
    * @return integer 
    */ 
    public function getET2() { 
     return $this->eT2; 
    } 
} 

Unten ist die Ereignistyp-Entität

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* eventtype 
* 
* @ORM\Table(name="eventtype") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\eventtypeRepository") 
*/ 
class eventtype 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="EventName", type="string", length=255) 
    */ 
    protected $eventName; 


    /** 
    * @var int 
    * 
    * @ORM\Column(name="MaxLimit", type="integer") 
    */ 
    protected $maxLimit; 


    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set eventName 
    * 
    * @param string $eventName 
    * @return eventtype 
    */ 
    public function setEventName($eventName) 
    { 
     $this->eventName = $eventName; 

     return $this; 
    } 

    /** 
    * Get eventName 
    * 
    * @return string 
    */ 
    public function getEventName() 
    { 
     return $this->eventName; 
    } 


    /** 
    * Set maxLimit 
    * 
    * @param integer $maxLimit 
    * @return eventtype 
    */ 
    public function setMaxLimit($maxLimit) 
    { 
     $this->maxLimit = $maxLimit; 

     return $this; 
    } 

    /** 
    * Get maxLimit 
    * 
    * @return integer 
    */ 
    public function getMaxLimit() 
    { 
     return $this->maxLimit; 
    } 
} 

Die Ereignistabelle ist bereits mit nur fünf Zeilen gefüllt, die 5 Ereignistypen darstellen. Maxlimit für Poker (id = 1) ist 12, für Schach (id = 2) ist es 4 und für den Rest drei, dh. Cricket (id = 3), Marmor (id = 4) & Fußball (id = 5) ist er 10.

Antwort

1

Ich weiß nicht, warum Sie "diese Logik Validierung müssen in der Steuerung" ... Es ist eine gute Übung, um Fat Controller zu vermeiden.

Meine Lösung nicht perfekt mit Ihrem Bedarf passen, aber ich schlage trotzdem: Ich tought Sie eine custom validation constraint schaffen könnten (mit Abhängigkeiten so können Sie den Entity Manager injizieren und Sie können prüfen, ob ein Ereignis voll ist oder nicht)

und dann fügen Sie einfach Ihre Einschränkung in den Anmerkungen der einzelnen Felder: $eT1 und $eT2

+0

Sie für den Vorschlag danken :) Aber ich brauche die Validierungslogik in der Steuerung, da es meine Anforderung ist – utkarsh2k2