0

Я хочу, чтобы создать пользовательский элемент и использовать короткое имя для добавления элемента в форме, используя новый ServiceManager tecnique для ZF2 V.2.1 +Zend Framework 2 Пользовательские элементы, использующие ServiceManager не работают

Я пытаюсь скопировать тот же образец zend documentation шаг за шагом, но он не работает.

Когда я использую сервис Writting короткое имя, он вызывает исключение, поскольку сервис не найден:

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 у меня есть invokable обслуживание быть в состоянии использовать короткое имя:

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

Вы указали использование SecureDraw \ Form \ Element \ или что-то вроде этого, в верхней части, если нет, укажите, пожалуйста, имя пространства имен, которое может избежать этой проблемы, ошибка явно говорит о том, что он не может найти класс, который вы пытаетесь создать экземпляр –

ответ

1

Проблема в том, что элементы, созданные с помощью FormElementManager, должны быть созданы в методе init вместо метода __Construct, как он может видеть в этом page.

zend documentation плохо объяснил

+0

, эта страница теперь недоступна. – sectus

0

Временное решение: В вашем собственном модуле, создайте следующие два файла:

  1. FormElementManagerConfig с invokables коротких имен ваших пользовательских элементов формы;
  2. Форма подкласса \ Factory и переопределить getFormElementManager и передать конфигурацию конструктору FormElementManager;

Затем вы можете использовать свою собственную фабрику для создания своей формы (вы можете передать очень рудиментарный, например пустой массив или более или менее полноценный $ spec, в $ factory-> createForm()), :

$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; 
    } 
} 
+0

Это все еще необходимо? Вся документация заставляет это звучать как фабрика/invokable 'form_elements', чтобы пользовательские элементы были доступны из коробки, но я видел ваш вклад в вкладчиков ZF, и похоже, что ничего не изменилось. – claytond