CakePHP с PHPStan: Свойство не принимает тортИЛИ стол

#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