TYPO3 Extbase @param int 不起作用

3

我在我的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);

在Typo3 6.2.6和PHP 5.6.3中,这个功能运行良好,但在Typo3 6.2.12和PHP 5.6.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
你知道为什么我的repository需要Foo\Bar\Domain\Repository\int而不是int吗?

PHP似乎对类型提示进行了更严格的检查?错误消息来自PHP,而不是TYPO3。尝试从getProductById(int $ProductId)中删除int - Jost
是的,我知道这是 PHP 的错误信息。如果我删除 int,它可以工作,但我认为这不是最好的解决方案。 - Marcel
你尝试过添加前导斜杠,例如\int吗? - Viktor Livakivskyi
仅供参考:标量类型声明仅适用于PHP 7,因此它实际上不应该起作用。 - Viktor Livakivskyi
不行,不起作用。但在PHP 5.6.3和旧版本的Typo3中可以工作。 - Marcel
所以,在 PHP 5.6.3 和 5.6.12 之间发生了某些变化。唯一的建议是删除标量类型声明,因为它不受 PHP 5.6 支持。 - Viktor Livakivskyi
2个回答

3
如Jost和Viktor在评论中所述,这不是TYPO3的错误信息,而是PHP的错误信息。PHP不支持原始类型(如intbool等)的类型提示(它将在PHP 7中支持)。 此代码实际执行的操作:使用int作为类型提示,PHP假定您需要一个名为int的类的实例作为参数(请注意,此行为将在PHP 7中更改)。因为未指定命名空间,PHP假定此int类位于当前命名空间Foo\Bar\Domain\Repository中。这意味着当您使用$this->productRepository->getProductById(5)调用此方法时,您正在传递一个整数值(5)作为参数,其中PHP期望一个(可能不存在的)类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)

0

尝试使用@param \integer代替参数中的类型提示。然而,\integer是扩展生成器在模型类中默认生成的类型。

我建议仅使用PHPDoc注释而不是PHP的类型提示。Extbase会在需要时验证类型,这样你就会少遇到麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接