#cakephp #phpstan
Вопрос:
Работая над уровнями PHPStan с новым приложением, я добрался до уровня 3 и начал получать сообщения об ошибках от всех моих тестовых приспособлений для моделей. Основной формат выглядит следующим образом:
------
Line tests/TestCase/Model/Table/UsersTableTest.php
------
43 Property VisualizeTestTestCaseModelTableUsersTableTest::$Users (VisualizeModelTableUsersTable) does not accept CakeORMTable.
------
Код, на который ссылается эта ошибка, является:
/**
* setUp method
*
* @return void
*/
public function setUp(): void
{
parent::setUp();
$config = $this->getTableLocator()->exists('Users') ? [] : ['className' => UsersTable::class];
$this->Users = $this->getTableLocator()->get('Users', $config);
}
Этот установочный код был создан с использованием cake bake, поэтому я не уверен, что он ищет. Кто-нибудь еще знает, что решит эту проблему для меня?
ОТРЕДАКТИРОВАНО: Я провел небольшой дальнейший поиск. Единственная версия функции getTableLocator (), которую я смог найти, связанная с этим стеком, была в классе TableRegistry. Этот класс, в свою очередь, имеет функцию get (), и эта функция действительно возвращает объект типа CakeOrmTable:
/**
* Get a table instance from the registry.
*
* See options specification in {@link TableLocator::get()}.
*
* @param string $alias The alias name you want to get.
* @param array $options The options you want to build the table with.
* @return CakeORMTable
* @deprecated 3.6.0 Use {@link CakeORMLocatorTableLocator::get()} instead. Will be removed in 5.0.
*/
public static function get(string $alias, array $options = []): Table
{
return static::getTableLocator()->get($alias, $options);
}
Значит ли это, что мои тесты должны ожидать класс CakeORMTable? ТБХ, мне еще многое предстоит сделать для тестирования моделей (как вы, возможно, догадались), поэтому я не уверен в последствиях этого.
Комментарии:
1. Вы можете использовать встроенные аннотации, чтобы исправить это. Или используйте ModelAwareTrait и loadModel() с аннотацией класса. Существует несколько способов сообщить статическому анализатору конкретный тип объекта.
2. Спасибо, @mark. Я нахожу эти аннотации удивительно полезными!
Ответ №1:
Вопрос в том, как сделать вывод из $this->getTableLocator()->get('Users', $config);
того, что он должен возвращаться VisualizeModelTableUsersTable
.
Вы можете написать расширение типа динамического возврата, если придумаете логику, которая может вывести это из абстрактного синтаксического дерева и, возможно, из других мест, таких как конфигурация.
Вполне возможно, что расширение https://github.com/CakeDC/cakephp-phpstan возможно, вы уже справились с этим, этот класс определенно выглядит так: https://github.com/CakeDC/cakephp-phpstan/blob/master/src/Type/TableLocatorDynamicReturnTypeExtension.php