ZF2 - 在非对象错误上调用成员函数

ZF2 - Call to a member function on a non-object error

我正在尝试实现一个简单的掷骰子服务并在 .phtml 文件中使用它。我知道我的问题经常在 SO 上被报告,但我在其他问题上找不到解决方案。

我收到以下错误消息:

Fatal error: Call to a member function getDiceResult() on a non-object in rolladice.phtml on line 11

这是第 11 行:

<?php
    $result =  $this->rollADiceService->getDiceResult();
    echo "<p>Roll-a-dice result: ".$result."</p>";
?>

控制器设置如下:

class RollADiceController extends AbstractActionController
{

    private $rollADiceService;

    public function setPluginManager(PluginManager $plugins) {
        parent::setPluginManager($plugins);
        $this->rollADiceService = $this->getServiceLocator()
            ->get('RollADiceService');
    }
    ...

Module.php中,我有:

public function getServiceConfig()
{
    return array(
        'factories'=>array(
            'LoginLogoutService' => function() {
                return new LoginLogoutService();
            },
            'RollADiceService' => function() {
                return new RollADiceService();
            },
        ),
    );
}

我正在使用相同的技术(即 setPluginManager)在其他控制器中毫无问题地检索我的服务实例。我做错了什么?

P.S.: 使用调试器,我可以看到 setPluginManager() 被调用,但是 $this->rollADiceService 变量被初始化为null。为什么?

我觉得你的问题很简单。

<?php
$result =  $this->rollADiceService()->getDiceResult();
echo "<p>Roll-a-dice result: ".$result."</p>";
?>

在 rollADiceService 之后添加这些括号应该可以解决您的问题。如果没有括号,Zend View 实例会尝试访问名为 rollADiceService 的视图变量,这显然是 NULL。 通过添加括号,您告诉 View 它应该在已注册的视图助手中查找 rollADiceService。

希望对您有所帮助:)

最终,有两个问题:

i) 我重构了我的代码,将调用结果作为 $this 可以访问的变量传递给 rollADiceService->getDiceResult()

ii) 劫持 setPluginManager() 不是推荐的做法。我已经根据服务为我的控制器实现了工厂。