【问题标题】:Fatal error: Call to a member function findAll() on null in TYPO3致命错误:在 TYPO3 中调用 null 上的成员函数 findAll()
【发布时间】:2017-08-22 22:10:59
【问题描述】:

我想获取存储库的对象,但出现下一个错误

在 null 上调用成员函数 findAll()

错误行是$projects = $this->projectRepository->findAll();

首先使用对象管理器获取存储库,它没有工作。目前的配置是: 在控制器中

/**
 *projectRepository
 *
 * @var \VENDOR\MyExtName\Domain\Repository\ProjectRepository
 * @inject
 */
protected $projectRepository = null;

和存储库

class ProjectRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
  public function createQuery() {
    $query = parent::createQuery();
    $query->getQuerySettings()->setRespectStoragePage(FALSE);
    return $query;
  }
}

findByUid($uid) 也会发生这种情况

对象存在于 DB 中,在 BE 中可见。

我清理了缓存,删除了typo3temp 目录的内容,并遵循了关于类似错误(我认为)Call to a member function findAll() on a non-object 的问题,但它没有工作,我遇到的异常不同。

感谢您的帮助,请指导我纠正此错误

【问题讨论】:

  • 嗯,这表明$this->projectRepository 不是你想象的那样。把它倒出来看看。假设您的日志显示您需要查看的另一个错误。就像您的自动加载器失败或者您在那些 c 样式 cmets 上的元数据中有错字。
  • 或者简单地尝试在您的索引操作中创建一个这样的存储库实例:$test = new \VENDOR\MyExtName\Domain\Repository\ProjectRepository();,如果失败,您将获得更多信息,什么是错的。
  • 我在使用findAll()指令之前使用var_dump作为打印属性,并看到了我的存储库的正确实例

标签: php typo3 extbase typo3-7.6.x


【解决方案1】:

这个错误几乎都是由extbase的注解“编译”引起的,和缓存有关。你说你清了缓存,把typo3temp的内容也去掉了,但是清缓存的方法很不一样,并不是对每个缓存都有效。

例如,注释缓存只能通过使用安装工具的清除缓存按钮来清除。 TYPO3 后端顶部的工具栏图标不会清除这些类型的缓存。

注释缓存不会存储在typo3temp 文件夹afaik 中,但在数据库中有自己的部分。永远不要通过手动删除typo3temp 文件夹内容来清除缓存,而应始终通过安装工具或TYPO3 后端或CLI 中的适当按钮或命令来完成。

最后,PHP 类的自动加载缓存也不会被安装工具清除。因此,如果您在开发中向扩展添加新的 PHP 类,则需要通过扩展管理器卸载并重新安装扩展。如果你使用 composer 来安装你的 TYPO3 实例,它又有点不同。如果是这种情况,您可以通过键入命令 composer dump-autoload 来清除自动加载缓存,以清除 composer 的类加载缓存,因为 TYPO3 在 composer 模式下使用它。

我猜你只是没有尝试安装工具按钮来清除缓存。

【讨论】:

  • 谢谢,它与安装工具的清除 chaches 按钮一起使用,但显示了 Oops 错误类型的其他错误,即 PHP Warning: class_parents(): object or string expected in .... 。我从 TYPO3 BE 上的工具栏删除了typo3temp 内容并清除了缓存,现在一切正常。
  • 现在我使用其他实体的其他存储库并且在findAll() 再次发生,我只单击了安装工具后的干净缓存并且工作正常。
【解决方案2】:

如果您忘记在控制器中注入存储库,则会发生此错误:

/**
 *projectRepository
 *
 * @var \VENDOR\MyExtName\Domain\Repository\ProjectRepository
 * @inject
 */
protected $projectRepository = null;

【讨论】:

    【解决方案3】:

    如果你使用方法__construct,注意不要输入__constract。

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多