ZF 2 - Fatal Error: Call to a member function getPosts() on null

ZF 2 - Fatal Error: Call to a member function getPosts() on null

我正在使用 Zend Framework 2 创建一个网站,我使用 Zend Technology 官方课程 Zend Framework 2:基础知识中的练习作为示例。

我有一个名为 posts 的 table,我想在我的主页上显示 table 的内容,按 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() 方法中。我尝试了很多不同的方法来 return 查询,但其中 none 有任何不同,甚至没有显示另一个错误。

您已将控制器注册为 'invokable'。当控制器管理器创建 IndexController 时,它将使用 IndexControllerFactory 创建 而无需 ;因此永远不会设置 Rxe\Factory\PostsTable 依赖项。

要解决此问题,请更新 module.config.php 并向您的工厂注册索引控制器 class。

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