Php 控制器中的Zend 2适配器工作正常,但不适用于该型号

Php 控制器中的Zend 2适配器工作正常,但不适用于该型号,php,model,zend-framework2,adapter,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;

我是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);
            },
        ),
    );
}

这是因为functin
getServiceLocator()
是在中实现的函数,其中
AbstractActionController
从中扩展,然后再次从中扩展控制器

ServiceLocator
本身由ServiceManager注入

你想做的事情是这样的:

// SomeController#someAction
$table = $this->getServiceLocator()->get('MyTableGateway');
$pages = $table->pages();
一个非常干净和苗条的控制器。然后为
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


剩下要做的就是修改
MyTableGateway
\u构造()
,以允许使用DbAdapter参数,就完成了。这样,您就可以访问网关中的DbAdapter,代码就完全干净且独立了;)

哇,这是我的rocketscience:-)为什么控制器和模型要检查呢$我不明白你的问题,请重新措辞:)对不起。我的意思是我应该把代码放在哪里。你能再帮我一点忙吗:-)第一个代码示例,正如示例中指出的,进入你的控制器操作。正如示例中指出的,第二个代码示例进入
模块的
getServiceConfig()
-类的返回数组,我已经添加了代码。这就是你的意思吗?然后我得到了这个错误:Zend\ServiceManager\ServiceManager::get无法获取或创建MyTableGateway的实例