提供给 Escape 帮助程序的对象,但标志不允许在 Zend Framework 2 中递归



所以我在一个Zend框架项目中工作,我正在使用Doctrine,我创建了我的表单,控制器和实体,但是当我运行我的项目时,我收到此错误:

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

这是我的实体:

namespace ApplicationEntity;
use DoctrineORMMapping as ORM;
use ZendFormAnnotation;
/**
 * Article
 *
 * @ORMTable()
 * @ORMEntity(repositoryClass="ApplicationEntityArticleRepository")
 */
class Article
{   
    /**
     * @ORMColumn(name="publication", type="boolean")
     */
    private $publication;
    public function __construct()
    {
        $this->date = new Datetime();
    }
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORMColumn(name="title", type="string", length=255)
     */
    private $title;
    /**
     * @var DateTime
     *
     * @ORMColumn(name="date", type="date")
     */
    private $date;
    /**
     * @var string
     *
     * @ORMColumn(name="content", type="text")
     */
    private $content;
    /**
     * @ORMOneToOne(targetEntity="ApplicationEntityImage", 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 ApplicationEntityImage $image
     * @return Article
     */
    public function setImage(ApplicationEntityImage $image = null)
    {
        $this->image = $image;
        return $this;
    }
    /**
     * Get image
     *
     * @return ApplicationEntityImage 
     */
    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();
?>

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

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

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

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

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

其中$element可以是表单、字段集或元素

通常,Object provided to Escape helper, but flags do not allow recursion 表示 Escape 视图帮助程序期待但未获得标量或具有 __toString() 方法的对象。这是一种说"伙计,我不能打印这个"的奇特方式。

解决方案是执行自己的呈现(不使用表单视图帮助程序),或者确保表单元素值是您可以echo的内容。

你有一个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的实例,当它在ZendViewHelperEscaperAbstractHelper中处理时,出现了一些问题。我不能确切地告诉你那里发生了什么,但如果你像我演示的那样声明__construct函数,一切正常。

相关内容

  • 没有找到相关文章

最新更新