Typo3 extbase @param int 不工作

Typo3 extbase @param int not working

我的 ProductsRepository 中有这个函数:

/**
 * @param int $ProductId
 * @return \Foo\Bar\Domain\Model\Products
 */
public function getProductById(int $ProductId) {
    $query = $this->createQuery();
    $query->matching(
        $query->equals('productId', $ProductId)
    );
    $query->setLimit(1);
    return $query->execute()->getFirst();
}

我这样称呼它:

$product = $this->productsRepository->getProductById($ProductId);

在带有 PHP 5.6.3 的 Typo3 6.2.6 中,这工作正常,但在带有 PHP 5.6.12 的 Typo3 6.2.12 中,它在我的 error.log 中说了以下内容:

[Wed Sep 09 15:59:32.922153 2015] [:error] [pid 26601] [client 192.168.113.4:58686] PHP Catchable fatal error: Argument 1 passed to Foo\Bar\Domain\Repository\ProductsRepository::getProductById() must be an instance of Foo\Bar\Domain\Repository\int, integer given

你知道为什么我的存储库想要 Foo\Bar\Domain\Repository\int 而不是 int 吗?

尝试 @param \integer 而不是删除参数中的类型提示。但是,类型 \integer 是扩展构建器在模型 类.

中默认生成的类型

我建议只使用 PHPDoc 注释而不是 PHPs 类型提示。 Extbase 会在需要的地方验证类型,这样您就可以减少麻烦。

正如 Jost 和 Viktor 在评论中提到的,这不是 TYPO3 错误消息,而是 PHP 错误消息。 PHP 不支持 intbool 等原始类型的类型提示(它会 as of PHP 7)。

这段代码实际做了什么:通过使用 int 作为类型提示,PHP 假定您需要 a 的一个实例class int 作为参数(请注意,此行为将在 PHP 7 中更改)。因为没有指定命名空间,PHP 假定此 int class 在您当前的命名空间 Foo\Bar\Domain\Repository 中。这意味着当您使用 $this->productRepository->getProductById(5) 调用此方法时,您将传递一个整数值 (5) 作为参数,其中 PHP 需要一个实例(可能不存在)class Foo\Bar\Domain\Repository\int。然后这会触发 "Argument 1 passed to ... must be an instance of ..., integer given" 错误。

总结一下: 使用标量类型提示在 PHP 5 中从未起作用,也永远不会起作用(它会在 PHP 7 中起作用)。如果它确实在某些时候看起来有效,很可能它并没有真正起作用,但由于 PHP 中的错误可能已在版本之间修复,因此没有触发错误。

回到TYPO3:在特定的地方,你可以在注释中使用标量类型提示。但是,这仅在请求参数映射到方法参数的地方才有可能(最值得注意的是控制器操作,您可以在其中使用 @param 注释和域实体属性,您可以在其中使用 @var 注释。这虽然是框架功能,但不适用于 $this->productRepository->getProductById(5).

等常规方法调用