我正在尝试实现一个简单的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
进行初始化。为什么呢?
答案 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。
我希望它有所帮助:)