我想创建一个自定义元素并使用短名称将元素添加到Form中,使用新的ServiceManager tecnique for ZF2 V.2.1 +
我尝试将zend documentation步骤的相同样本复制到步骤但不起作用。
当我使用写短名称的服务时,它会引发异常,因为找不到服务:
Zend\ServiceManager\Exception\ServiceNotFoundException
File:
Zend\ServiceManager\ServiceManager.php:456
Message:
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Test
我认为我的所有课程都相同,请参阅以下内容
这是我的自定义元素:
namespace SecureDraw\Form\Element;
use Zend\Form\Element\Text;
class ProvaElement extends Text {
protected $hola;
public function hola(){
return 'hola';
}
}
这是我的Module.php我的可调用服务能够使用短名称:
class Module implements FormElementProviderInterface {
//Rest of class
public function getFormElementConfig() {
return array(
'invokables' => array(
'Test' => 'SecureDraw\Form\Element\ProvaElement'
)
);
}
}
在我用于添加元素的表单中,注释行正常工作,但短名称不起作用:
$this->add(array(
'name' => 'prova',
//'type' => 'SecureDraw\Form\Element\ProvaElement',
'type' => 'Test', //Fail
));
在我的行动中:
$formManager = $this->serviceLocator->get('FormElementManager');
$form = $formManager->get('SecureDraw\Form\UserForm');
$prova = $form->get('prova');
echo $prova->hola();
答案 0 :(得分:1)
问题是通过FormElementManager创建的元素必须创建为init方法,而不是__Construct方法,它可以在page中看到。
zend documentation被严重解释
答案 1 :(得分:0)
解决方法: 在您自己的模块中,创建以下两个文件:
然后你使用你自己的工厂来创建你的表格,就像这样(你可以传递一个非常简陋的,例如空数组,或者或多或少完全成熟的$ spec到$ factory-&gt; createForm()):< / p>
$factory = new Factory();
$spec = array();
$form = $factory->createForm($spec);
FormElementManagerConfig.php:
class FormElementManagerConfig implements ConfigInterface
{
protected $invokables = array(
'anything' => 'MyModule\Form\Element\Anything',
);
public function configureServiceManager(ServiceManager $serviceManager)
{
foreach ($this->invokables as $name => $service) {
$serviceManager->setInvokableClass($name, $service);
}
}
}
MyFactory.php:
class Factory extends \Zend\Form\Factory
{
public function getFormElementManager()
{
if ($this->formElementManager === null) {
$this->setFormElementManager(new FormElementManager(new FormElementManagerConfig()));
}
return $this->formElementManager;
}
}