我的第一个控制器是
class MatchesController extends AbstractActionController {
public function checkLogsAction() {
// $logs=new LogsController();
$logs=$this->getServiceLocator()->get('Admin\LogsController');
$logs->writeLogs("log data");
die();
}
记录控制器
class LogsController extends AbstractActionController {
public function writeLogs($logData) {
$this->getServiceLocator()->get('Zend\Log\opta')->info($logData);
return true;
}
global.php
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
'Zend\Log\opta' => function ($sm) {
$fileName=date("Y-m-d");
$log = new Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream("./data/opta/$fileName");
$log->addWriter($writer);
return $log;
}
),
),
module.php
public function getServiceConfig() {
return array(
"factories"=>array(
'Admin\LogsController' => function ($sm) {
$logsController = new LogsController();
return $logsController;
},
我收到此错误: 致命错误:在null
上调用成员函数get()请帮我解决问题
答案 0 :(得分:0)
您的Admin\LogsController
扩展了AbstractActionController。但是你不要将它用作AbstractActionController
!
通过处理(http)请求来调用AbstractActionController,由此ZF2应用程序将请求路由到控制器并执行操作方法。在此处理期间,将ServiceLocator / ServiceManager的实例传递给控制器。这就是你所缺少的。因此,您尝试在null对象上调用方法。
您不能简单地从另一个ActionController实例化ActionController
。 (当然,有可能,有很多可承受的)。如果以这种方式使用它,则要确保新控制器实例包含ServiceLocator,请求,响应等实例...
你应该考虑:
a)你的应用程序中是Admin\LogsController
真的是一个AbstractActionController吗? (我假设它不是,分别是你的代码示例)
b)将ServiceLocator注入您的自定义对象(LogsController)或更清洁的方式:注入记录器实例。
示例:
public function getServiceConfig() {
return array(
'factories' => array(
'Admin\LogsController' => function ($sm) {
$logsController = new LogsController();
$logsController->setServiceLocator($sm); // you have to implement!
return $logsController;
},
);
}