0

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

}

添加模块.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);
            },
        ),
    );
}
4

1 回答 1

0

这是因为 functin是一个在which extends fromgetServiceLocator()中实现的函数,然后您又是从中扩展 Controllers 的。AbstractControllerAbstractActionController

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.

您剩下要做的就是修改__construct()您的MyTableGateway以允许 DbAdapter-Parameter 并且您完成了。这样您就可以访问网关内的 DbAdapter,并且代码都是干净且分离的;)

于 2013-08-18T10:55:48.267 回答