Я получил эту функцию в моем репозитории 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
?
Как упоминалось в комментариях Йоста и Виктора, это не сообщение об ошибке 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)
,
Пытаться @param \integer
вместо этого удалите тип, намекающий на аргументы. Тем не менее, тип \integer
это то, что Extension Builder генерирует по умолчанию в модельных классах.
Я рекомендую использовать только аннотации PHPDoc вместо подсказок типа PHPs. Extbase проверяет тип, где он необходим, и вы получаете меньше проблем.