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()
不是推荐的做法。我已经根据服务为我的控制器实现了工厂。
我正在尝试实现一个简单的掷骰子服务并在 .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()
不是推荐的做法。我已经根据服务为我的控制器实现了工厂。