我正在使用Zend Framework 2.3.1(PHP 5.4.21) 我正在尝试使用注释构建表单,我正在使用的代码很简单:
控制器:
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Entity\Test;
use DoctrineORMModule\Form\Annotation\AnnotationBuilder;
// ...
$entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
/* @var $entityManager \Doctrine\ORM\EntityManager */
$test = new Test();
$builder = new AnnotationBuilder($entityManager);
// for debugging purposes
$spec = $builder->getFormSpecification($test);
\Zend\Debug\Debug::dump($spec);
Application \ Entity \ Test看起来像这样:
namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation;
/**
* @Annotation\Name("this-works")
* @ORM\Entity
* @Annotation\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
*/
class Test{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
* @Annotation\Attributes({"type":"hidden"})
*/
protected $id;
/**
*
* @ORM\Column(type="string")
* @Annotation\Filter({"name":"StringTrim"})
* @Annotation\Validator({"name":"StringLength", "options":{"min":1, "max":25}})
* @Annotation\Validator({"name":"Regex", "options":{"pattern":"/^[a-zA-Z][a-zA-Z0-9_-]{0,24}$/"}})
* @Annotation\Attributes({"type":"text"})
* @Annotation\Options({"label":"Username:"})
* @Annotation\AllowEmpty(true)
*/
protected $fullName;
}
我得到的结果是:
object(ArrayObject)#338 (1) {
["storage":"ArrayObject":private] => array(6) {
["name"] => string(4) "this-works"
["attributes"] => array(0) {
}
["elements"] => array(0) {
}
["fieldsets"] => array(0) {
}
["hydrator"] => string(35) "Zend\Stdlib\Hydrator\ObjectProperty"
["input_filter"] => object(ArrayObject)#339 (1) {
["storage":"ArrayObject":private] => array(0) {
}
}
}
}
表单名称anntation正在运行,但所有字段都被排除在外。
我试图调试它,我发现如果我更改Zend / Form / Annotation / AnnotationBuilder.php函数checkForExclude(注意删除回调)
protected function checkForExclude($annotations)
{
$results = $this->getEventManager()->trigger('checkForExclude', $this, array(
'annotations' => $annotations,
), function ($r) {
return (true === $r);
});
return (bool) $results->last();
}
到
protected function checkForExclude($annotations)
{
$results = $this->getEventManager()->trigger('checkForExclude', $this, array(
'annotations' => $annotations,
));
return (bool) $results->last();
}
它正常工作(fullName字段在表单声明中)。
我做错了什么或者只是ZF2中的错误? 现在试着弄清楚几天,我没有想法。
答案 0 :(得分:1)
到目前为止,我唯一的解决方案是在使用带注释的表单时从application.config.php中删除ZendDeveloperTools。
答案 1 :(得分:0)
你可能有些东西干扰了EventManager的监听链。
例如,如果我启用了ZendDeveloperTools模块,我会得到相同的结果。您可以通过检查传递给Zend \ EventManager \ EventManager.php中事件的回调闭包的最终结果来验证这一点:464
$listenerCallback = $listener->getCallback();
if ('checkForExclude' === $event) {
var_dump($listenerCallback);
}
如果回调的类不是Zend \ Form \ Annotation \ ElementAnnotationsListener,那么闭包不会将正确的结果作为参数接收。
答案 2 :(得分:0)
幸运的是,你可以保留ZendDeveloperTools!您只需在ApplicationPath / config / autoload / zdt.local.php上的ZDT自动加载文件中将一个属性更改为false:
array('Events' => array('Enabled' = false, ...), ...)