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

时间:2015-08-31 16:45:21

标签: php zend-framework2

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

我收到以下错误消息:

  

致命错误:调用成员函数getDiceResult()         在第11行的rolladice.phtml中的非对象上

这是第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进行初始化。为什么呢?

2 个答案:

答案 0 :(得分:0)

最终,有两个问题:

i)我重构了我的代码,将调用结果传递给class Test(object): def __init__(self): self.some_dictionary = { 'key_one': self.method_one(), 'key_two': self.method_two(), 'key_three': self.method_three() } def method_one(self): pass def method_two(self): pass def method_three(self): pass 作为rollADiceService->getDiceResult()可以访问的变量。

ii)劫持$this不是推荐做法。我根据服务为我的控制器实施了工厂。

答案 1 :(得分:-1)

我认为你的问题非常简单。

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

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

我希望它有所帮助:)