ZF2使用$ this-> getServiceLocator() - > get()调用成员函数get()on null

时间:2018-05-29 10:24:25

标签: php zend-framework2

我的第一个控制器是

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()

请帮我解决问题

1 个答案:

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