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

时间:2014-02-27 21:24:00

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

所以我在 Zend Framework 项目中工作,我正在使用 Doctrine ,我创建了我的表单,控制器和实体,但是当我运行我的项目时出现了这个错误:

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

最后我的观点,我认为我有一个错误:

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

将对象设置为属性而不是字符串时,可能会出现此错误:

$element->setAttribute('class', $object)

其中$ element可以是Form,Fieldset或Element

答案 2 :(得分:1)

通常,Object provided to Escape helper, but flags do not allow recursion表示Escape视图帮助程序期望,但没有得到标量或具有__toString()方法的对象。这是一种奇特的说法,老兄,我无法打印出来。&#34;

解决方案是要么自己进行渲染(不使用表单视图助手),要么确保表单元素值是echo

答案 3 :(得分:0)

您有init个功能。注释掉__construct函数并将其写成:

public function __construct(ObjectManager $em, $name = null, $options = array())
{
    $this->setObjectManager($em);
    parent::__construct($name, $options);

    //here you add all the form elements
    //(meaning: just put all the content of your init() function here)
    //if that's a construct function, you also need to add:
    //private $inputFilter;
    //at the top of your class, it is not declared in your code
}

这是您提供的构造函数:

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

错误被抛出,因为你写道:

$form = new ArticleForm($this->getObjectManager());

因此,传递给__construct函数的第一个参数是objectManager的实例,当它在Zend\View\Helper\Escaper\AbstractHelper中处理时,出现了错误。我无法确切地告诉你那里发生了什么,但是如果你宣布__construct函数,那么一切正常。