ZF2 Вызов функции-члена get () для null с использованием $ this-> getServiceLocator () -> get () - PullRequest
0 голосов
/ 29 мая 2018

Мой первый контроллер -

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

Я получаю эту ошибку: Неустранимая ошибка: вызов функции-члена get () для null

Пожалуйста, помогите мне решить эту проблему

1 Ответ

0 голосов
/ 29 мая 2018

Ваш 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;
       },
   );
}
...