Php 控制器中的Zend 2适配器工作正常,但不适用于该型号
我是Zend 2的新手。 我做了一个控制器和模型 我得到以下错误: 致命错误:在第25行的C:\websites\zend2\module\Pages\src\Pages\Model\PagesTable.php中对非对象调用成员函数get() 我做错了什么 解决方案: 控制器: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;
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的实例