php - 提供给 Escape 助手的对象,但标志不允许在 Zend Framework 2 中递归

标签 php zend-framework doctrine-orm zend-framework2 zend-form

所以我在一个 Zend Framework 项目中工作并且我正在使用 Doctrine,我创建了我的表单、 Controller 和实体,但是当我运行我的项目时我得到了这个错误:

Object provided to Escape helper, but flags do not allow recursion

这是我的实体:

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation;

/**
 * Article
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Application\Entity\ArticleRepository")
 */
class Article
{   
    /**
     * @ORM\Column(name="publication", type="boolean")
     */
    private $publication;

    public function __construct()
    {
        $this->date = new \Datetime();
    }
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255)
     */
    private $title;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="date")
     */
    private $date;

    /**
     * @var string
     *
     * @ORM\Column(name="content", type="text")
     */
    private $content;

    /**
     * @ORM\OneToOne(targetEntity="Application\Entity\Image", cascade={"persist","remove"})
     */
    private $image;

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

    /**
     * Set title
     *
     * @param string $title
     * @return Article
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

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

    /**
     * Set date
     *
     * @param \DateTime $date
     * @return Article
     */
    public function setDate($date)
    {
        $this->date = $date;

        return $this;
    }

    /**
     * Get date
     *
     * @return \DateTime 
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set content
     *
     * @param string $content
     * @return Article
     */
    public function setContent($content)
    {
        $this->content = $content;

        return $this;
    }

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

    /**
     * Set publication
     *
     * @param boolean $publication
     * @return Article
     */
    public function setPublication($publication)
    {
        $this->publication = $publication;

        return $this;
    }

    /**
     * Get publication
     *
     * @return boolean 
     */
    public function getPublication()
    {
        return $this->publication;
    }

    /**
     * Set image
     *
     * @param \Application\Entity\Image $image
     * @return Article
     */
    public function setImage(\Application\Entity\Image $image = null)
    {
        $this->image = $image;

        return $this;
    }

    /**
     * Get image
     *
     * @return \Application\Entity\Image 
     */
    public function getImage()
    {
        return $this->image;
    }

}

这是带有字段验证的表单:

class ArticleForm extends Form implements ObjectManagerAwareInterface

{
    /**
     * @var EntityManager
     */
    protected $em;

    public function init()
    {
        $this->add(array(
                'name' => 'title',
                'attributes' => array(
                        'type' => 'text',
                ),
                'options' => array(
                        'label' => 'Title'
                ),
        ));

        $this->add(array(
            'name' => 'id',
            'attributes' => array(
                'type'  => 'hidden',
            ),
        ));

        $this->add(array(
                'name' => 'content',
                'attributes' => array(
                        'type' => 'textera',
                ),
                'options' => array(
                        'label' => 'Content'
                ),
        ));

        $this->add(array(
                'name' => 'date',
                'attributes' => array(
                        'type' => 'text',
                        'class' => 'datepicker',
                ),
                'options' => array(
                        'label' => 'Date',
                ),
        ));


        $this->add(array(
                'name' => 'publication',
                'attributes' => array(
                        'type' => 'Checkbox',
                ),
        ));

        $this->add(array(
                'name' => 'url',
                'attributes' => array(
                        'type' => 'file',
                        'id'   => 'files',
                        'class'=> 'upload'  
                ),
                'options' => array(
                        'label' => 'Url'
                ),
        ));

        $this->add(array(
                'name' => 'alt',
                'attributes' => array(
                        'type' => 'text',
                ),
                'options' => array(
                        'label' => 'Alt'
                ),
        ));

        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Go',
                'class' => 'submit',
            ),
        ));

        $this->setInputFilter($this->createInputFilter());
    }

    public function __construct($name = null, $options = array())
    {         
        parent::__construct($name, $options);
    }

    public function createInputFilter()
    {
    if (!$this->inputFilter) {
            $inputFilter = new InputFilter();
            $factory     = new InputFactory();

            $inputFilter->add($factory->createInput(array(
                    'name'     => 'title',
                    'required' => true,
                    'filters'  => array(
                            array('name' => 'StripTags'),
                            array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                            array(
                                    'name'    => 'StringLength',
                                    'options' => array(
                                            'encoding' => 'UTF-8',
                                            'min'      => 6,
                                            'max'      => 100,
                                    ),
                            ),
                    ),
            )));

            $inputFilter->add($factory->createInput(array(
                    'name'     => 'content',
                    'required' => true,
                    'filters'  => array(
                            array('name' => 'StripTags'),
                            array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                            array(
                                    'name'    => 'StringLength',
                                    'options' => array(
                                            'encoding' => 'UTF-8',
                                            'min'      => 10,
                                    ),
                            ),
                    ),
            )));

            $inputFilter->add($factory->createInput(array(
                    'name'     => 'publication',
                    'required' => false,
            )));

            $inputFilter->add($factory->createInput(array(
                    'name'     => 'date',
                    'required' => true,
            )));

            $inputFilter->add($factory->createInput(array(
                    'name'     => 'image',
                    'required' => true,
            )));

            $this->inputFilter = $inputFilter;
        }

        return $this->inputFilter;
    }

    public function setObjectManager(ObjectManager $objectManager) {
        $this->objectManager = $objectManager;
    }

    /**
     * Get the object manager
     *
     * @return ObjectManager
     */
    public function getObjectManager() {
        return $this->objectManager;
    }

}

然后我的行动:

public function addAction()
{       
    $form = new ArticleForm($this->getObjectManager());
    $article = new Article();
    $request = $this->getRequest();
    $hydrator = new DoctrineHydrator($this->getObjectManager(), get_class($article));
    $form->setHydrator($hydrator);
    $form->bind($article);
    if ($this->zfcUserAuthentication()->hasIdentity()) {
        if ($request->isPost()) 
        {
            $form->setData($request->getPost());
            if ($form->isValid()) {
                $this->getObjectManager()->persist($article);
                    $this->getObjectManager()->flush();

                    return $this->redirect()->toRoute('blog');
            }
             }
    }
    else
    {
        return $this->redirect()->toRoute('user');
    }
    return array('form' => $form);
}

最后是我认为我有错误的 View :

 <?php 
   $form = $this->form;
   $form->setAttribute('action', $this->url('add', array('action' => 'add')));
   $form->prepare();
 ?>
 <?php  
   echo $this->form()->openTag($form);
 ?>
 <ul>
    <li>
        <?php echo $this->formHidden($form->get('id'));?>
    <li>
    <li>
        <label>Publication:</label>
        <?php echo $this->formInput($form->get('publication'));?>
    </li>
    <li>
        <label>Title:</label>
        <?php echo $this->formInput($form->get('title'));?>
    </li>
         // ....
    <li>
        <?php echo $this->formSubmit($form->get('submit'));?></li>
    </ul>
<?php
    echo $this->form()->closeTag();
?>

就是这样,这几乎是我的代码,我尝试了一切,但没有找到任何解决方案,我认为这是我认为的错误,所以如果有人有任何想法,我将不胜感激

最佳答案

这可能是因为日期对象。 尝试将表单元素的类型更改为最新:

$this->add(array(
        'name' => 'date',
        'type' => 'Date',
        'attributes' => array(
                'type' => 'text',
                'class' => 'datepicker',
        ),
        'options' => array(
                'label' => 'Date',
        ),
));

关于php - 提供给 Escape 助手的对象,但标志不允许在 Zend Framework 2 中递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22080746/

相关文章:

php - 将 XML 数据发布到 MySQL 会返回错误?

zend-framework - Raspberry Pi 上的 Zend Framework 抛出 Zend_Config_Exception 'Section ' ' 无法在 (...) 中找到'

php - Doctrine 2 迁移工作流程

php - Doctrine GeneratedValue=NONE 不断为 Id 插入 NULL

zend-framework - 发送 : How to use 'not equal to' in WHERE clause?

symfony - 学说额外的延迟加载无法按预期与计数一起工作

PHP处理表单数据

PHP MVC,PDO : loop through returned mysql data

php - 从 2 个表中获取内容

php - Zend 框架 : Can i just get GET params?