2013-09-29 27 views
1

在我的Zend \ Form \ Fieldset AddressFieldset中,它需要Zend \ Db \ TableGateway \ AbstractTableGateway BundeslandTable用于\ Zend \ Form \ Element \ Select()。zf2 ServiceManagerAwareInterface in Fieldset

因此,我在此AddressFieldset中实现\ Zend \ ServiceManager \ ServiceManagerAwareInterface,并使用init()而不是__construct()。

而且在module.config.php(不仅在 'form_elements' 测试,也是在 'service_manager')

'form_elements' => array(
    'factories' => array(
     'MyFormway\Form\Fieldset\Address' => function($sm) { 
      $addressFieldset = new MyFormway\Form\Fieldset\AddressFieldset(); 
      $addressFieldset->setServiceManager($sm); 
      return $addressFieldset; 
     } 
    ), 
), 

在\ Zend的\表格\表单的init():

$this->add(array(
     'type' => 'MyFormway\Form\Fieldset\Address', 
     'name' => 'address', 
    )); 

,这将引发一个错误:

Zend\Form\FormElementManager::get was unable to fetch or create an instance for MyFormway\Form\Fieldset\Address 

为什么是使用Zend无法抓取该字段集的实例?

编辑-----------------------

'form_elements' => array(
    'factories' => array(
     'MyFormway\Form\Fieldset\Address' => function($formElementManager) { 
      die('inna form_elements config'); 
      $addressFieldset = new \MyFormway\Form\Fieldset\AddressFieldset(); 
      $addressFieldset->setServiceManager($formElementManager->getServiceLocator()); 
      return $addressFieldset; 
     } 
    ), 
), 

,因为我已经在Zend \表格\ FormElementManager我取的ServiceLocator ..也许不需要,因为所有的XxxManager扩展了Zend \ ServiceManager \ AbstractPluginManager,并且这扩展了ServiceManager。 在FormElementManager中,在AbstractPluginManager中也没有方法getServiceManager()。

但我的问题:die()没有被调用加上面的错误。这是一个错误吗? ......我站了大墙:(

编辑-----------------------

它适用于形式,但不对于一个字段!

回答

0

你可以做一个快速检查,如果\Invokable在所有叫什么名字?一些专业die() -debugging就足够了。

除此之外,潜在的误差源将是你的ServiceManager注射在你提供的代码中,你实际上并没有注入ServiceLocator,而是FormElementManager

$addressFieldset->setServiceManager($sm->getServiceManager()); 

这样做是不好的做法寿。你应该只注入你实际需要的东西。鉴于你正在注入整个经理,我假设你要么与Doctrine一起工作,要么需要访问一些DB-Data。像这样做:

'Foo' => function ($formElementManager) { 
    $sl = $formElementManager->getServiceManager(); 
    $fs = new FooFieldset(); 
    $fs->setDbDependency(
     $sl->get('MyDbDependency') 
    ); 
    return $fs; 
} 

最后小记:当你添加一个字段,你不需要的$this->add()中添加'name' => 'foo',因为字段集的名称将通过字段集__construct('name')定义。

+0

谢谢。 MyFormway \ Form \ Fieldset \ AddressFieldset()的构造函数永远不会被调用。而且从来没有在'form_elements' - '工厂' - 'MyFormway \ Form \ Fieldset \ Address'中的module.config.php中的函数。 – allapow