Controller中的Zend 2适配器工作正常,但在Model中没有

时间:2013-08-18 10:42:57

标签: php model zend-framework2 adapter

我是Zend 2的新手。 我制作了一个控制器和模型。

我收到以下错误:

致命错误:在第25行的C:\ websites \ zend2 \ module \ Pages \ src \ Pages \ Model \ PagesTable.php中的非对象上调用成员函数get()

我做错了什么?!?!

解决方案:

控制器:

namespace Pages\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController {

protected $pagesTable;

function indexAction() {
    return new ViewModel(array(
        'pages' => $this->getPagesTable()->fetchAll(),
    ));
}

public function getPagesTable()
{
    if (!$this->pagesTable) {
        $sm = $this->getServiceLocator();
        $this->pagesTable = $sm->get('Pages\Model\PagesTable');
    }
    return $this->pagesTable;
}
}

型号:

namespace Pages\Model;
use Zend\Db\TableGateway\TableGateway;

class PagesTable  {

protected $tableGateway;

public function __construct(TableGateway $tableGateway)
{
    $this->tableGateway = $tableGateway;

}

public function fetchAll()
{
    $resultSet = $this->tableGateway->select();
    return $resultSet;
}

}

添加 Module.php

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'Pages\Model\PagesTable' =>  function($sm) {
                $tableGateway = $sm->get('PagesTableGateway');
                $table = new PagesTable($tableGateway);
                return $table;
            },
            'PagesTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $resultSetPrototype = new ResultSet();
                return new TableGateway('pages', $dbAdapter, null, $resultSetPrototype);
            },
        ),
    );
}

1 个答案:

答案 0 :(得分:0)

这是因为功能getServiceLocator()AbstractController AbstractActionController中实现的功能,ServiceLocator延伸到该功能,然后您再次扩展控制器。

// SomeController#someAction $table = $this->getServiceLocator()->get('MyTableGateway'); $pages = $table->pages(); 本身由ServiceManager注入。

你想做事的方式是这样的:

MyTableGateway

非常干净纤薄的控制器。然后,您为// Module#getServiceConfig 'factories' => array( 'MyTableGateway' => function($serviceLocator) { $dbAdapter = $serviceLocator()->get('Zend\Db\Adapter\Adapter'); $gateway = new MyTableGateway($dbAdapter); return $gateway; } )

设置服务
MyTableGateway

此工厂将调用您的类Zend\Db\Adapter\Adapter,然后使用构造函数注入来注入依赖项,在本例中为__construct()

剩下要做的就是修改MyTableGateway的{​​{1}}以允许DbAdapter参数,然后就完成了。通过这种方式,您可以访问Gateway内的DbAdapter,代码全部清晰且分开;)