php - ZF2 使用 $this->getServiceLocator()->get() 在 null 上调用成员函数 get()
问题描述
我的第一个控制器是
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;
}
全局.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;
}
),
),
模块.php
public function getServiceConfig() {
return array(
"factories"=>array(
'Admin\LogsController' => function ($sm) {
$logsController = new LogsController();
return $logsController;
},
我收到此错误:致命错误:在 null 上调用成员函数 get()
请帮我解决解决方案
解决方案
您Admin\LogsController
扩展了 AbstractActionController。但是你不要把它当作AbstractActionController
!
AbstractActionController 通常通过处理 (http) 请求来调用,由此 ZF2 应用程序会将请求路由到控制器并执行操作方法。在这个处理过程中,ServiceLocator/ServiceManager 的一个实例被传递给控制器。这就是你所缺少的。因此,您尝试调用空对象的方法。
您不能简单地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;
},
);
}
推荐阅读
- json - 如何将 Json 输出分配给 Key 变量
- python - 如何解析两个三维数组“fid,fi-> fd”的numpy.einsum
- apache - SVN 日志文件命令
- python - 在 pandas 列中搜索字符串列表
- visual-studio - 如何复制或拆分 SSAS 项目或数据源视图
- c# - c# wpf在运行时编辑按钮
- docker - docker 应用程序的 IP 地址
- angular - Angular 8:创建自定义水平条形图
- r - 具有二进制变量和 x 轴日期和长数据格式的 ggplot geom_vline
- r - 使用 mapdeck 的 add_trips 函数创建数据层时出错