使用依赖项+ zend框架2以zend形式调用模型

时间:2012-11-28 11:50:01

标签: zend-form zend-framework2

我正在尝试以zend形式获取我的类别模型,以便使用带有zend框架2的select元素。

经过大量的代码搜索,我发现我可以注入或拉出依赖项。

我在我的module.php

中执行了以下代码

我想在CategoryForm.php中使用categoryTable.php(模型)文件

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'Category\Model\CategoryTable' =>  function($sm) {
                $tableGateway = $sm->get('CategoryTableGateway');
                $table = new CategoryTable($tableGateway);
                //echo "<pre>";print_r($table);echo "</pre>";
                return $table;
            },
            'CategoryTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Category());
                return new TableGateway('Of_Restaurants_Category', $dbAdapter, null, $resultSetPrototype);
            },
            'Category\Form\CategoryForm' => function ($sm) {
                $service = $sm->get('Category\Model\CategoryTable');
                $form    = new Form;
                $form->setService($service);
                return $form;
            }
        ),
    );
}

然后我将以下代码放入我的控制器中。

 $form = $this->getServiceLocator()->get("Category\Form\CategoryForm");

然后我将以下代码放入我的CategoryForm.php

public function getCategoryTable()
{
    if (!$this->categoryTable) {

        $sm = $this->getServiceLocator();

        $this->categoryTable = $sm->get('Category\Model\CategoryTable');
    }
    return $this->categoryTable;
}

然后我就像这样在同一个文件中调用它

public function __construct($name = null)
{

   parent::__construct('category');
   echo "<pre>";print_r($this->getCategoryTable());die;

   .... other code

我发现了这个错误

Fatal error: Call to undefined method Category\Form\CategoryForm::getServiceLocator() in D:\wamp\www\zendapp\module\Category\src\Category\Form\CategoryForm.php on line 120

请帮忙。我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

我找到了解决方案

步骤:1

这是我的module.php代码

public function getServiceConfig()
{
    return array(
        'invokables' => array(

            'Category\Form\CategoryForm' => 'Category\Form\CategoryForm',

        ),
        'factories' => array(
            'Category\Model\CategoryTable' =>  function($sm) {
                $tableGateway = $sm->get('CategoryTableGateway');
                $table = new CategoryTable($tableGateway);
                //echo "<pre>";print_r($table);echo "</pre>";
                return $table;
            },
            'CategoryTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Category());
                return new TableGateway('Of_Restaurants_Category', $dbAdapter, null, $resultSetPrototype);
            },
        ),
    );
}

步骤:2

然后在控制器中我做了这个改变

  // $form = new CategoryForm();
  // Service locator now injected
  $form = $this->getServiceLocator()->get('Category\Form\CategoryForm');

步骤:3

然后在我的categoryForm.php中我做了以下更改

 use Zend\ServiceManager\ServiceManager;
 use Zend\ServiceManager\ServiceManagerAwareInterface;

protected $ serviceManager;

public function getCategoryTable()
{
    if (!$this->categoryTable) {
        $sm = $this->getServiceManager();
        $this->categoryTable = $sm->get('Category\Model\CategoryTable');
    }
    return $this->categoryTable;
}

protected function getCatList()
{

    $groups = $this->getCategoryTable()->fetchAll();
    return $groups;
}

public function getServiceManager()
{
    if ( is_null($this->serviceManager) ) {
        throw new Exception('The ServiceManager has not been set.');
    }

    return $this->serviceManager;
}

public function setServiceManager(ServiceManager $serviceManager)
{
    $this->serviceManager = $serviceManager;
    // Call the init function of the form once the service manager is set
    $this->init();
    return $this;
} 
public function __construct($name = null) // constructor I finished immediately
{
    parent::__construct('category');
}

我添加INIT()函数来获取servicemanager

public function init()
{
   $this->setAttribute('method', 'post');
   $options = array();
    foreach ($this->getCatList() as $cat) {
        $options[$cat->id] = $cat->title;
    }

    $this->add(array(
         'type' => 'Zend\Form\Element\Select',
         'name' => 'parent_id',
         'options' => array(
             'label' => 'Parent Category',
             'empty_option' => 'Please choose Parent Category',
              'value_options' => $options,
         ),

    ));
}

希望这有助于谁是新的ZF2。