我是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);
},
),
);
}
答案 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,代码全部清晰且分开;)