Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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
Doctrine orm ZF2 inputfilter对象不存在编辑对象未验证_Doctrine Orm_Zend Framework2_Zend Form_Zend Validate_Zfdoctrine - Fatal编程技术网

Doctrine orm ZF2 inputfilter对象不存在编辑对象未验证

Doctrine orm ZF2 inputfilter对象不存在编辑对象未验证,doctrine-orm,zend-framework2,zend-form,zend-validate,zfdoctrine,Doctrine Orm,Zend Framework2,Zend Form,Zend Validate,Zfdoctrine,所以我得到了一个ZF2应用程序,在InputFilter中得到了一个表单和一个InputFilter,我有: $this->add( array( 'name' => 'email', 'required' => true, 'validators' => array( array( 'name'

所以我得到了一个ZF2应用程序,在InputFilter中得到了一个表单和一个InputFilter,我有:

$this->add(
        array(
            'name'       => 'email',
            'required'   => true,
            'validators' => array(
                array(
                    'name' => 'EmailAddress'
                ),
                array(
                    'name'      => 'DoctrineModule\Validator\NoObjectExists',
                    'options' => array(
                        'object_repository' => $sm->get('doctrine.entitymanager.orm_default')->getRepository('YrmUser\Entity\User'),
                        'fields'            => 'email'
                    ),
                ),
            ),
        )
    );
工作得很好,但是当我编辑一个现有对象并保存它时,NoObjectExists验证器会说找到了一个匹配的对象,所以它不会验证。 这个问题有解决办法吗? 或者我应该删除编辑表单上的验证器,并在插入副本时捕获异常吗

更新:

是相同的问题,但答案是只删除编辑时的验证器,这当然不是一个解决方案。因为在插入副本时,您仍然必须捕获引发的异常。我可以这样做没有问题,但我要求的是一个解决方案,使它与NoObjectExists一起工作(否则,如果我必须捕获重复的异常,这个验证器有什么用)

更新,添加其他相关代码(我的表单和实体有更多的字段,但我删除了它们以保持其可读性)

表格:

过滤器:

class UserFilter extends InputFilter
{
/**
 * [__construct description]
 * 
 * @param ServiceLocator $sm servicelocator
 */
public function __construct($sm)
{


    $this->add(
        array(
            'name'       => 'email',
            'required'   => true,
            'validators' => array(
                array(
                    'name' => 'EmailAddress'
                ),
                array(
                    'name'      => 'DoctrineModule\Validator\NoObjectExists',
                    'options' => array(
                        'object_repository' => $sm->get('doctrine.entitymanager.orm_default')->getRepository('YrmUser\Entity\User'),
                        'fields'            => 'email'
                    ),
                ),
            ),
        )
    );
}
}
控制器操作:

public function editAction() 
{
    $id = (int) $this->params('id', null);
    if (null === $id) {
        return $this->redirect()->toRoute('manage-users');
    }

    $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');

    $formManager = $this->getServiceLocator()->get('FormElementManager');
    $form = $formManager->get('UserForm');

    $user = $em->find('YrmUser\Entity\User', $id);
    $form->setInputFilter(new UserFilter($this->getServiceLocator()));
    $form->bind($user);

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setData($request->getPost());
        if ($form->isValid()) {
            $em->persist($user);
            $em->flush();
            return $this->redirect()->toRoute('manage-users');
        }
    }

    return array(
        'form' => $form,
        'id' => $id
    );
}
实体:

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



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



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

/**
 * Set id.
 *
 * @param int $id user id
 *
 * @return void
 */
public function setId($id)
{
    $this->id = (int) $id;
}


/**
 * Get email.
 *
 * @return string
 */
public function getEmail()
{
    return $this->email;
}

/**
 * Set email.
 *
 * @param string $email user email adress
 *
 * @return void
 */
public function setEmail($email)
{
    $this->email = $email;
}
}
提前感谢,


Yrm

我最近在我的项目中遇到了同样的问题,我花了很多时间寻找解决方案,最终找到了这个模块

它使用两个海关验证器,它们扩展了
doctriemodule\Validator\NoObjectExists
NoEntityExists
用于
添加
操作,而
NoOtherEntityExists
用于
编辑
操作

所以我用这个方法来解决我的问题。这是我迄今为止提出的解决方案:

NoOtherEntityExists验证程序:

use Zend\Validator\Exception\InvalidArgumentException;
use DoctrineModule\Validator\NoObjectExists;

class NoOtherEntityExists extends NoObjectExists
{
    private $id; //id of the entity to edit
    private $id_getter;  //getter of the id
    private $additionalFields = null; //other fields
    public function __construct(array $options)
    {
        parent::__construct($options);
         if (isset($options['additionalFields'])) {
          $this->additionalFields = $options['additionalFields'];
         }
        $this->id = $options['id'];
        $this->id_getter = $options['id_getter'];
    }
    public function isValid($value, $context = null)
    {
        if (null != $this->additionalFields && is_array($context)) {
            $value = (array) $value;
            foreach ($this->additionalFields as $field) {
                $value[] = $context[$field];
            }
        }
        $value = $this->cleanSearchValue($value);
        $match = $this->objectRepository->findOneBy($value);

        if (is_object($match) && $match->{$this->id_getter}() != $this->id) {
            if (is_array($value)) {
                $str = '';
                foreach ($value as $campo) {
                    if ($str != '') {
                        $str .= ', ';
                    }
                    $str .= $campo;
                }
                $value = $str;
            }
            $this->error(self::ERROR_OBJECT_FOUND, $value);
            return false;
        }
        return true;
    }
}
use Zend\Validator\Exception\InvalidArgumentException;
use DoctrineModule\Validator\NoObjectExists;

class NoEntityExists extends NoObjectExists
{
    private $additionalFields = null;
    public function __construct(array $options)
    {
        parent::__construct($options);
        if (isset($options['additionalFields'])) {
            $this->additionalFields = $options['additionalFields'];
        }
    }
    public function isValid($value, $context = null)
    {
        if (null != $this->additionalFields && is_array($context)) {
            $value = (array) $value;
            foreach ($this->additionalFields as $field) {
                $value[] = $context[$field];
            }
        }
        $value = $this->cleanSearchValue($value);
        $match = $this->objectRepository->findOneBy($value);
        if (is_object($match)) {
            if (is_array($value)) {
                $str = '';
                foreach ($value as $campo) {
                    if ($str != '') {
                        $str .= ', ';
                    }
                    $str .= $campo;
                }
                $value = $str;
            }
            $this->error(self::ERROR_OBJECT_FOUND, $value);
            return false;
        }
        return true;
    }
}
无实体存在验证程序:

use Zend\Validator\Exception\InvalidArgumentException;
use DoctrineModule\Validator\NoObjectExists;

class NoOtherEntityExists extends NoObjectExists
{
    private $id; //id of the entity to edit
    private $id_getter;  //getter of the id
    private $additionalFields = null; //other fields
    public function __construct(array $options)
    {
        parent::__construct($options);
         if (isset($options['additionalFields'])) {
          $this->additionalFields = $options['additionalFields'];
         }
        $this->id = $options['id'];
        $this->id_getter = $options['id_getter'];
    }
    public function isValid($value, $context = null)
    {
        if (null != $this->additionalFields && is_array($context)) {
            $value = (array) $value;
            foreach ($this->additionalFields as $field) {
                $value[] = $context[$field];
            }
        }
        $value = $this->cleanSearchValue($value);
        $match = $this->objectRepository->findOneBy($value);

        if (is_object($match) && $match->{$this->id_getter}() != $this->id) {
            if (is_array($value)) {
                $str = '';
                foreach ($value as $campo) {
                    if ($str != '') {
                        $str .= ', ';
                    }
                    $str .= $campo;
                }
                $value = $str;
            }
            $this->error(self::ERROR_OBJECT_FOUND, $value);
            return false;
        }
        return true;
    }
}
use Zend\Validator\Exception\InvalidArgumentException;
use DoctrineModule\Validator\NoObjectExists;

class NoEntityExists extends NoObjectExists
{
    private $additionalFields = null;
    public function __construct(array $options)
    {
        parent::__construct($options);
        if (isset($options['additionalFields'])) {
            $this->additionalFields = $options['additionalFields'];
        }
    }
    public function isValid($value, $context = null)
    {
        if (null != $this->additionalFields && is_array($context)) {
            $value = (array) $value;
            foreach ($this->additionalFields as $field) {
                $value[] = $context[$field];
            }
        }
        $value = $this->cleanSearchValue($value);
        $match = $this->objectRepository->findOneBy($value);
        if (is_object($match)) {
            if (is_array($value)) {
                $str = '';
                foreach ($value as $campo) {
                    if ($str != '') {
                        $str .= ', ';
                    }
                    $str .= $campo;
                }
                $value = $str;
            }
            $this->error(self::ERROR_OBJECT_FOUND, $value);
            return false;
        }
        return true;
    }
}
将此验证器与inputFilter一起使用:

use Zend\Validator\Exception\InvalidArgumentException;
use DoctrineModule\Validator\NoObjectExists;

class NoOtherEntityExists extends NoObjectExists
{
    private $id; //id of the entity to edit
    private $id_getter;  //getter of the id
    private $additionalFields = null; //other fields
    public function __construct(array $options)
    {
        parent::__construct($options);
         if (isset($options['additionalFields'])) {
          $this->additionalFields = $options['additionalFields'];
         }
        $this->id = $options['id'];
        $this->id_getter = $options['id_getter'];
    }
    public function isValid($value, $context = null)
    {
        if (null != $this->additionalFields && is_array($context)) {
            $value = (array) $value;
            foreach ($this->additionalFields as $field) {
                $value[] = $context[$field];
            }
        }
        $value = $this->cleanSearchValue($value);
        $match = $this->objectRepository->findOneBy($value);

        if (is_object($match) && $match->{$this->id_getter}() != $this->id) {
            if (is_array($value)) {
                $str = '';
                foreach ($value as $campo) {
                    if ($str != '') {
                        $str .= ', ';
                    }
                    $str .= $campo;
                }
                $value = $str;
            }
            $this->error(self::ERROR_OBJECT_FOUND, $value);
            return false;
        }
        return true;
    }
}
use Zend\Validator\Exception\InvalidArgumentException;
use DoctrineModule\Validator\NoObjectExists;

class NoEntityExists extends NoObjectExists
{
    private $additionalFields = null;
    public function __construct(array $options)
    {
        parent::__construct($options);
        if (isset($options['additionalFields'])) {
            $this->additionalFields = $options['additionalFields'];
        }
    }
    public function isValid($value, $context = null)
    {
        if (null != $this->additionalFields && is_array($context)) {
            $value = (array) $value;
            foreach ($this->additionalFields as $field) {
                $value[] = $context[$field];
            }
        }
        $value = $this->cleanSearchValue($value);
        $match = $this->objectRepository->findOneBy($value);
        if (is_object($match)) {
            if (is_array($value)) {
                $str = '';
                foreach ($value as $campo) {
                    if ($str != '') {
                        $str .= ', ';
                    }
                    $str .= $campo;
                }
                $value = $str;
            }
            $this->error(self::ERROR_OBJECT_FOUND, $value);
            return false;
        }
        return true;
    }
}
在我的自定义
输入过滤器
中,我添加了两种方法:一种是附加
NoEntityExists
验证器,另一种是附加
NoOtherEntityExists
验证器:

/**
 * Appends doctrine's NoObjectExists Validator for Add FORM .
 *
 * @param \Doctrine\ORM\EntityRepository $repository
 * @return \Zend\InputFilter\InputFilter
 */
public function appendAddValidator(EntityRepository $repository)
{
    $this->add($this->getFactory()->createInput( array(
            'name' => 'libellesite', //unique field name
            'validators' => array(
                    array(
                            'name' => 'Netman\Form\NoEntityExists',//use namespace
                            'options' => array(
                                    'object_repository' => $repository,
                                    'fields' => 'libellesite',
                                    'messages' => array(
                                    'objectFound' => 'custom message here'
                                    ),
                            ),
                    ),
            )
    )));
    return $this;
}

/**
 * Appends doctrine's NoObjectExists Validator for EDIT FORM.
 *
 * @param \Doctrine\ORM\EntityRepository $repository
 * @return \Zend\InputFilter\InputFilter
 */
public function appendEditValidator(EntityRepository $repository, $id)
{
    $this->add($this->getFactory()->createInput( array(
            'name' => 'libellesite',
            'validators' => array(
                    array(
                            'name' => 'Netman\Form\NoOtherEntityExists',
                            'options' => array(
                                    'object_repository' => $repository,
                                    'fields' => 'libellesite',
                                    'id'=>$id, //
                                    'id_getter'=>'getCodesite',//getter for ID
                                    'messages' => array(
                                    'objectFound' => 'custom message here'
                                    ),
                            ),
                    ),
            )
    )));
    return $this;
}
控制器:

use Zend\Validator\Exception\InvalidArgumentException;
use DoctrineModule\Validator\NoObjectExists;

class NoOtherEntityExists extends NoObjectExists
{
    private $id; //id of the entity to edit
    private $id_getter;  //getter of the id
    private $additionalFields = null; //other fields
    public function __construct(array $options)
    {
        parent::__construct($options);
         if (isset($options['additionalFields'])) {
          $this->additionalFields = $options['additionalFields'];
         }
        $this->id = $options['id'];
        $this->id_getter = $options['id_getter'];
    }
    public function isValid($value, $context = null)
    {
        if (null != $this->additionalFields && is_array($context)) {
            $value = (array) $value;
            foreach ($this->additionalFields as $field) {
                $value[] = $context[$field];
            }
        }
        $value = $this->cleanSearchValue($value);
        $match = $this->objectRepository->findOneBy($value);

        if (is_object($match) && $match->{$this->id_getter}() != $this->id) {
            if (is_array($value)) {
                $str = '';
                foreach ($value as $campo) {
                    if ($str != '') {
                        $str .= ', ';
                    }
                    $str .= $campo;
                }
                $value = $str;
            }
            $this->error(self::ERROR_OBJECT_FOUND, $value);
            return false;
        }
        return true;
    }
}
use Zend\Validator\Exception\InvalidArgumentException;
use DoctrineModule\Validator\NoObjectExists;

class NoEntityExists extends NoObjectExists
{
    private $additionalFields = null;
    public function __construct(array $options)
    {
        parent::__construct($options);
        if (isset($options['additionalFields'])) {
            $this->additionalFields = $options['additionalFields'];
        }
    }
    public function isValid($value, $context = null)
    {
        if (null != $this->additionalFields && is_array($context)) {
            $value = (array) $value;
            foreach ($this->additionalFields as $field) {
                $value[] = $context[$field];
            }
        }
        $value = $this->cleanSearchValue($value);
        $match = $this->objectRepository->findOneBy($value);
        if (is_object($match)) {
            if (is_array($value)) {
                $str = '';
                foreach ($value as $campo) {
                    if ($str != '') {
                        $str .= ', ';
                    }
                    $str .= $campo;
                }
                $value = $str;
            }
            $this->error(self::ERROR_OBJECT_FOUND, $value);
            return false;
        }
        return true;
    }
}
添加操作中

$repository = $em->getRepository('Entity\Name');  
$form->setInputFilter($filter->appendAddValidator($repository));
$id = $this->params('id', null);
$repository = $em->getRepository('Entity\Name');  
$form->setInputFilter($filter->appendEditValidator($repository,$id));
编辑操作中

$repository = $em->getRepository('Entity\Name');  
$form->setInputFilter($filter->appendAddValidator($repository));
$id = $this->params('id', null);
$repository = $em->getRepository('Entity\Name');  
$form->setInputFilter($filter->appendEditValidator($repository,$id));

请发布控制器编辑操作的代码以及整个表单代码。如果没有更多的代码,就很难说问题出在哪里,因为您可能会收到此错误的原因有很多。很明显,为什么我会得到正确的“错误”?表单未验证,因为数据库中已存在该电子邮件。问题是现有的电子邮件属于我试图编辑/更新的行。问题很明显,是什么导致了它不是。这可能是控制器操作中的一个问题,也可能是形式问题,或者仅举几个问题。我只是想排除一些快速goodle搜索的问题,似乎这个问题可能是这个问题的重复,我添加了其他相关代码,但我认为问题的原因也是显而易见的。我正在编辑的记录有一封电子邮件,当我不在表单中更改电子邮件并尝试保存它时,验证程序会进行选择(我猜)以查看该电子邮件是否存在。它确实存在,因此验证器不进行验证。我需要的是一种将当前行排除在检查之外的方法。我已经看到了另一个问题,但是仅仅删除验证器并不是一个解决方案。然后,您必须捕获重复条目的异常,但我想知道是否有方法使NoObjectExists工作。我认为正确的解决方案是使用