ZF2 Annotation构建不起作用 - 排除所有字段

时间:2014-06-11 12:09:38

标签: php forms annotations zend-framework2

我正在使用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中的错误? 现在试着弄清楚几天,我没有想法。

3 个答案:

答案 0 :(得分:1)

到目前为止,我唯一的解决方案是在使用带注释的表单时从application.config.php中删除ZendDeveloperTools。

已知错误:https://github.com/zendframework/zf2/issues/6166

答案 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, ...), ...)