【问题标题】:Typo3 Call to a member function on nullTypo3 在 null 上调用成员函数
【发布时间】:2018-09-12 09:54:43
【问题描述】:

我在 Stackoverflow 上看到过类似的问题,但这些答案都没有对我有用(包括清除缓存、清除 PHP 操作码缓存系统、停用和重新激活扩展程序)。希望有人能指出我正确的方向。

我正在为扩展运行预定命令。在某些时候,我的命令需要从 MyController 类中调用方法 test()。

我尝试通过继承调用和所有注入方法创建对类的引用,但无论我尝试哪种方式,我总是遇到同样的问题...:

Call to a member function test() on null

最近我使用了不推荐的注入方法,但它简化了我下面的示例,所以我现在将使用它。 (VendorName 和 ExtensionName 是 obvs 虚拟名称):

* @var \VendorName\ExtensionName\Controller\MyController
* @inject
*/
protected $mc;  

public function myCommand()
{
     return $this->mc->test(); //should return true

}   

...在 MyController 内部

public function test()
{
    return true;
}

【问题讨论】:

  • 您在更改代码后是否刷新了系统缓存?尝试注入整个控制器看起来很奇怪。相反,您应该将相关代码移动到服务或类似的地方,并在两个位置都使用它。
  • 是的,所有缓存都清除了,包括安装工具 php 缓存。我想做的就是从另一个类中调用一个函数。扩展生成器告诉我像显示的那样使用注入。 Typo3 文档告诉我有 3 种使用注入的方法(所有这些方法都给出相同的错误)。其他人说根本不要使用注入,而是创建一个我也尝试过的类的实例,但有同样的问题。如果您有更好的方法,请告诉我,我也会尝试。
  • 一般来说注入应该是有效的,如果没有更多的代码,很难说哪里出了问题。如果你只是在 myCommand 中创建一个类的实例,我猜它正在工作? (以确保它不是自动加载/类名问题)。它是什么类型的命令,它是否扩展了基于 extbase 的命令?依赖注入仅适用于通过对象管理器实例化的类(即在 extbase 上下文中)。
  • 什么样的对象包含你的“myCommand”函数?仅当您的对象被另一个 Extbase 对象使用 ObjectManager->get() 调用时,注入才有效

标签: dependency-injection typo3


【解决方案1】:

问题不在于命令类上的注入调用,而在于 MyController 类上的一些自动生成的代码。似乎 Extension Builder 可能会通过在错误的位置错误地创建 @inject 行来导致错误。这是它自动创建的代码:

  /**
 * @var \VendorName\ExtensionKey\Domain\Repository\ExampleRepository
 * @inject
 */
protected $importService = null;

 /**
 * @inject
 */

protected $exampleRepository = null;

...第二个@inject 调用会产生错误。它应该只是:

 /**
 * @var \VendorName\ExtensionKey\Domain\Repository\ExampleRepository
 * @inject
 */
protected $importService = null;
protected $exampleRepository = null;

不幸的是,调试并没有告诉你是哪个类导致了问题,所以我自然认为这是我自己的代码。

【讨论】:

    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2020-03-10
    • 2017-09-24
    • 2018-02-06
    • 2018-09-29
    • 2018-08-04
    相关资源
    最近更新 更多