Typo3 extbase @param int не работает

Я получил эту функцию в моем репозитории Products:

/**
* @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 говорится следующее:

[Ср 09.09.15: 59: 32.922153 2015] [: error] [pid 26601] [client 192.168.113.4:58686] PHP-фатальная ошибка, которую можно исправить: Аргумент 1 передан в Foo \ Bar \ Domain \ Repository \ ProductsRepository :: getProductById () должен быть экземпляром Foo \ Bar \ Domain \ Repository \ int, задано целое число

Знаете ли вы, почему мой репозиторий хочет Foo\Bar\Domain\Repository\int вместо int?

3

Решение

Как упоминалось в комментариях Йоста и Виктора, это не сообщение об ошибке TYPO3, а сообщение об ошибке PHP. PHP не поддерживает подсказки типов для примитивных типов, таких как int, bool и тому подобное (так и будет, начиная с PHP 7).

Что этот код на самом деле делает: Используя int как подсказка типа, PHP предполагает, что вам нужно экземпляр класса int в качестве аргумента (обратите внимание, что это поведение изменится в PHP 7). Поскольку пространство имен не указано, PHP предполагает это int класс, чтобы быть в вашем текущем пространстве имен Foo\Bar\Domain\Repository, Это означает, что когда вы вызываете этот метод, используя $this->productRepository->getProductById(5)вы передаете целочисленное значение (5) в качестве параметра, где PHP ожидает экземпляр класса (возможно, несуществующего) Foo\Bar\Domain\Repository\int, Это затем вызывает «Аргумент 1 передан … должен быть экземпляром …, задано целое число» ошибка.

Подвести итоги: Использование подсказок скалярного типа никогда не работало и никогда не будет работать в PHP 5 (так будет в PHP 7). Если в какой-то момент он действительно работал, скорее всего, он действительно не работал, но не возникла ошибка из-за ошибки в PHP, которая могла быть исправлена ​​между версиями.

Возвращаясь к TYPO3: В определенных местах вы можете использовать скалярные подсказки типа в аннотациях. Однако это возможно только в тех местах, где параметры запроса сопоставляются с аргументами метода (прежде всего действия контроллера, в которых вы можете использовать @param аннотации и атрибуты сущности домена, где вы можете использовать @var аннотаций. Однако это базовая функция, которая не будет работать с обычными вызовами методов, такими как $this->productRepository->getProductById(5),

3

Другие решения

Пытаться @param \integer вместо этого удалите тип, намекающий на аргументы. Тем не менее, тип \integer это то, что Extension Builder генерирует по умолчанию в модельных классах.

Я рекомендую использовать только аннотации PHPDoc вместо подсказок типа PHPs. Extbase проверяет тип, где он необходим, и вы получаете меньше проблем.

0

По вопросам рекламы [email protected]