首页 > 解决方案 > 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()

请帮我解决解决方案

标签: phpzend-framework2

解决方案


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;
       },
   );
}

推荐阅读