2015-06-22 6 views
1

Я создаю сайт с использованием Zend Framework 2, и я использую в качестве примера упражнение из официального курса Zend Technology, Zend Framework 2 : Основы.ZF 2 - Fatal Error: вызов функции-члена getPosts() по нуле

У меня есть таблица под названием posts, и я хочу показать содержимое таблицы на моей домашней странице, упорядоченной по id. Эти коды я написал:

Controller/PostsTableTrait.php

trait PostsTableTrait 
{ 
    private $postsTable; 

    public function setPostsTable($postsTable) 
    { 
     $this->postsTable = $postsTable; 
    } 
} 

Controller/IndexController.php

class IndexController extends AbstractActionController 
{ 
    use PostsTableTrait; 

    public function indexAction() 
    { 
     return new ViewModel(array(
      'post' => $this->postsTable->getPosts() 
     )); 
    } 
} 

Factory/IndexControllerFactory.php

class IndexControllerFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $serviceManager = $serviceLocator->getServiceLocator()->get('ServiceManager'); 

     $indexController = new IndexController(); 
     $indexController->setPostsTable($serviceManager->get('Rxe\Factory\PostsTable')); 

     return $indexController; 
    } 
} 

Factory/PostsTableFactory.php

class PostsTableFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     return new PostsTable(PostsTable::$tableName, $serviceLocator->get('Zend\Db\Adapter\AdapterService')); 
    } 
} 

Model/PostsTable.php

class PostsTable extends TableGateway 
{ 
    public static $tableName = "posts"; 

    public function getPosts() 
    { 
     $select = new Select(self::$tableName); 
     $select->columns(array(
      'date', 
      'title', 
      'text', 
      'category' 
     )); 
     $select->order('id DESC'); 

     return $select; 
    } 
} 

config/module.config.php

'controllers' => array(
    'invokables' => array(
     'Rxe\Controller\Index' => 'Rxe\Controller\IndexController', 
     'Rxe\Controller\Panel' => 'Rxe\Controller\PanelController' 
    ), 
    'factories' => array(
     'Rxe\Factory\PanelController' => 'Rxe\Factory\PanelControllerFactory' 
    ) 
), 
'service_manager' => array(
    'factories' => array(
     'Rxe\Factory\PanelForm' => 'Rxe\Factory\PanelFormFactory', 
     'Rxe\Factory\PanelFilter' => 'Rxe\Factory\PanelFilterFactory', 
     'Rxe\Factory\PostsTable' => 'Rxe\Factory\PostsTableFactory', 
     'Zend\Db\Adapter\AdapterService' => 'Zend\Db\Adapter\AdapterServiceFactory' 
    ) 
), 

Я не знаю, если ошибка может быть в методе getPosts(). Я попробовал много разных способов вернуть запрос, но ни один из них не имел никакого значения, даже не показал еще одну ошибку.

+0

Весь код выглядит отлично. То, что я не вижу, - это настройка для вашего адаптера DB. Можете ли вы подтвердить, что ваше соединение с БД работает? –

ответ

1

Вы зарегистрировали контроллер как «invokable». Когда диспетчер контроллера создает IndexController, он сделает это без с использованием IndexControllerFactory; поэтому зависимость Rxe\Factory\PostsTable никогда не устанавливается.

Чтобы исправить это, обновите module.config.php и зарегистрируйте контроллер индекса с классом фабрики.

'controllers' => [ 
    'factories' => [ 
     'Rxe\Controller\Index' => 'Rxe\Factory\IndexControllerFactory', 
    ], 
], 

Кроме того (не ошибка как таковые), но IndexControllerFactory вызовов ->get('ServiceManager')с помощью менеджера по обслуживанию.

Вы можете обновить его таким образом.

class IndexControllerFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $controllerManager) 
    { 
     // @var \Zend\ServiceManager\ServiceManager 
     $serviceManager = $controllerManager->getServiceLocator(); 

     $indexController = new IndexController(); 
     $indexController->setPostsTable($serviceManager->get('Rxe\Factory\PostsTable')); 

     return $indexController; 
    } 
} 
+0

Да! Это оно! Я забыл зарегистрировать его и изменить конфигурацию маршрута. Теперь ошибка исчезла, и мне нужно только исправить мои 'getPosts()' Спасибо. – mfgabriel92

Смежные вопросы