【问题标题】:Avoid "Call to a member function [...] on a non-object" error in MVC?避免 MVC 中的“在非对象上调用成员函数 [...]”错误?
【发布时间】:2015-05-04 08:21:38
【问题描述】:

我在 TYPO3 Extbase 中创建了一个不错的模型/视图/控制器扩展。我在 Inquiry 和 Investigator 之间有一个 n:1 的关系。

我需要检查当前登录的用户(调查员)是否有权访问当前查询。请参阅以下功能。

当查询未分配给调查员(因此对象为空)时,if($inquiry->getInvestigator()->getUid()) 方法返回致命错误:
Call to a member function getUid() on a non-object

有没有一种更简单的方法来避免该错误,例如只有一个 if 条件?或者这是干净的方法吗?

  /**
  * has the user access to inquiry?
  *
  * @param Tx_MyExt_Domain_Model_Inquiry
  * @return boolean
  */
 protected function hasInquiryAccess(Tx_MyExt_Domain_Model_Inquiry $inquiry) {
   if ($inquiry->getInvestigator()) {
     if ($inquiry->getInvestigator()->getUid() == $this->user->getUid()) {
       return TRUE;
     } else {
       return FALSE;
     }
   } else {
     return FALSE;
   }
 }

【问题讨论】:

    标签: model-view-controller model typo3 extbase


    【解决方案1】:

    改变

    if ($inquiry->getInvestigator()) {
    

    if (!is_null($inquiry->getInvestigator())) {
    

    if ($inquiry->getInvestigator() instanceof Tx_MyExt_Domain_Model_Inquiry) {
    

    这样代码将检查调查员是否存在。如果不是,它将返回 false(如您编码的那样),如果它存在,它将进行所有正确的操作

    【讨论】:

    • 这似乎是合理的,非常感谢。但这并不能完全回答我的问题——我仍然需要多个 if 条件来检查调查员和登录用户是否相同。在我的上下文中,$inquiry->getInvestigator()!is_null($inquiry->getInvestigator() 无论如何都具有相同的返回值。
    • 这有点艺术,但如果你想要一个,如果只是制作:if (!is_null($inquiry->getInvestigator()) && $inquiry->getInvestigator()->getUid() == $this->user->getUid()) { return true; } else { return false; } 我认为这是最简单和最快的方法。你不会找到任何原生的typo3方法
    • 我添加了instanceof 替代答案。也许重要的是要知道,如果您有多个条件,例如 Fixus 的示例,如果第一个条件失败,则不会评估第二个条件,因此不会出现致命错误。
    • 谢谢,我现在不知道括号中的第一个和第二个条件。这有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多