Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 2-表单验证-如果数据库中存在用户记录_Php_Validation_Symfony - Fatal编程技术网

Php Symfony 2-表单验证-如果数据库中存在用户记录

Php Symfony 2-表单验证-如果数据库中存在用户记录,php,validation,symfony,Php,Validation,Symfony,我正在与表单验证进行斗争。。(为什么简单的事情在SF2中如此困难和复杂?:) 我有一个验证器: /Acme/Crud/Validator/Constraints/isNewsInDB.php namespace Acme\CrudBundle\Validator\Constraints; use Symfony\Component\Validator\Constraint; class isTitleInDB extends Constraint { public $message

我正在与表单验证进行斗争。。(为什么简单的事情在SF2中如此困难和复杂?:)

我有一个验证器:

/Acme/Crud/Validator/Constraints/isNewsInDB.php

namespace Acme\CrudBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;


class isTitleInDB extends Constraint
{
    public $message= 'Username not unique';

    public function validatedBy()
    {
        return 'istitleindb';
              //return get_class($this).'Validator';
    }

}
/Acme/Crud/Validator/Constraints/isNewsInDBValidator.php

namespace Acme\CrudBundle\Validator\Constraints;

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

use Doctrine\Bundle\DoctrineBundle\Registry;
use Acme\CrudBundle\Entity\News;

class isTitleInDBValidator extends ConstraintValidator
{

    private $em;
    private $security_context;

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


    public function validate($value, Constraint $constraint)
    {
        $news = new News();
        $repository = $this->em->getRepository('CrudBundle:News');
        $newsitem = $repository->findOneBy(array('title' => $value));

        if (!$newsitem)
        {
            $this->context->addViolation(
                $constraint->message, 
                array('%string%' => $value)
            );
        }
    }

}
/Acme/CrudBundle/congif/services.yml:

parameters:
    validator.istitleindb.class: Acme\CrudBundle\Validator\Constraints\isTitleInDBValidator

services:
    validator.istitleindb:
        class: %validator.istitleindb.class%
        arguments: ["@doctrine"]
        tags:
            - { name: validator.constraint_validator, alias: istitleindb }
Acme/CrudBundle/Controller/DefaultController.php

namespace Acme\CrudBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Acme\CrudBundle\Entity\News;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\True;
use Acme\CrudBundle\Validator\Constraints\NoWord;       // This is My test Validator
use Acme\CrudBundle\Validator\Constraints\isTitleInDB;  // My Validator as Service to check in Database

use Symfony\Component\HttpFoundation\Session\Session;


class DefaultController extends Controller
{

      private function generateAddForm($entityObject)
      {
         return $this->createFormBuilder($entityObject)
                     ->add('title', 'text', array(
                           'constraints' => array(
                              new Length(array('min' => 10, 'max' => 15)),
                              new Email(),
                              new NoWord(),
                              new isTitleInDB(),  // <------- MY DB VALIDATOR
                           )
                      ))
                     ->add('body', 'textarea')
                     ->add('save', 'submit')
                     ->getForm();
      }
      ......
}
是否有更简单的方法来创建检查数据库中的内容的验证器


谢谢

当您注入@doctrine时,您将在构造函数中获得doctrine\Bundle\DoctrineBundle\Registry。您在服务isTitleInDBValidator中键入提示条令注册表作为EntityManager。在validate函数中,您没有使用$news变量。及 $this->em->getRepository('CrudBundle:News'); 错了吗?你必须像经理一样

$this->em->getManager()->getRepository('CrudBundle:News');

也许应该使用Uniquentity验证约束?
$this->em->getManager()->getRepository('CrudBundle:News');