所以我在一个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
函数,一切正常。