Symfony2验证限制

时间:2016-04-19 14:22:59

标签: mysql symfony doctrine-orm

我正在使用Login&注册表格在主页上我需要为用户提供两个单选按钮选项,用于选择两个事件(存储在变量eT1和eT2中)。但是我需要确保任何特定事件的maxlimit都不满。如果用户选择maxlimit已满的事件,则需要显示错误消息。 *我需要在控制器内部使用此验证逻辑。 *登录和注册我正在使用FOSUserBundle

这是控制器代码

<?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(),
        ));
    }
}

以下是用户实体

<?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;   
         }

    }

以下是事件实体

<?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;
    }
}

以下是eventtype实体

<?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;
    }
}

eventtype表已经填充了五行代表5种类型的事件。扑克的Maxlimit(id = 1)是12,对于Chess(id = 2),它是4,其余的是3。板球(id = 3),弹珠(id = 4)&amp;足球(id = 5)它是10。

1 个答案:

答案 0 :(得分:1)

我不知道为什么你“在控制器中需要这个验证逻辑”......这是避免胖控制器的好习惯。

我的解决方案不能完全满足您的需求,但无论如何我提议:我认为您可以创建一个custom validation constraint(具有依赖关系,这样您就可以注入实体管理器,您可以检查事件是否已满)

然后在每个字段的注释中添加您的约束:$eT1$eT2