Псалом: как обрабатывать специальные файлы просмотра?

Моя установка включает lib папка с классами и viewпапка с файлами PHP, которые производят вывод. Представления импортируются внутри View класс, подобный этому:

      class View {

    public function render(string $basename, Array $params) : string {
        extract($params, EXTR_PREFIX_INVALID, 'v');
        ob_start();
        include sprintf('%s/views/%s.php', dirname(__DIR__), $basename);
        $out = ob_get_contents();
        ob_end_clean();
        return $out;
    }

}

В этой ситуации у меня в основном две проблемы с Псалом:

  1. За View::render он сообщает UnresolvableInclude. Я даже могу напечатать $basename с чем-то вроде

             @param "view1"|"view2"|"about" $basename
    

    без эффекта. Остается неразрешимое включение.

  2. В extract() помещает содержание $paramsв локальной области, куда включены файлы просмотра. Это позволяет мне иметь

             <?=escape($foo)?>
    

    «Теги» в моем представлении файлы с $params === ['foo' => 'bar']. Однако Псалом не догоняет это и сообщает о множестве UndefinedGlobalVariable проблемы.

Мой вопрос: как я могу сообщить псалму о файлах просмотра и переменных? Или, в качестве альтернативы, как я могу реструктурировать этот код, чтобы псалом мог проверить его за меня?

1 ответ

В репозитории Psalm есть демонстрационный плагин TemlateChecker , который, похоже, делает что-то похожее: он смотрит на документ-блок в файле представления для тега, например @variablesfrom ClassName::methodи делает их доступными в файле шаблона. Или просто недвижимость на $thisпеременная из этого метода, не уверен. Это также упоминается в документации Псалма: Проверка файлов, отличных от PHP .

В качестве альтернативы вы можете заключить свой шаблон в минимальный метод / функцию, поскольку технически представление - это просто функция, которая принимает кучу переменных и возвращает строку: https://psalm.dev/r/66898ee87f

      <?php class HomePageView {  // view starts here
    /** @param list<string> $sections */
    public function render(
        string $title,
        array $sections
    ): string { ob_start();
?>
<html>
    <head>
       <title><?=$title?></title>
    </head>
    <body>
    <?php foreach ($sections as $section): ?>
        <section><?=$section?></section>
    <?php endforeach; ?>
    </body>
</html>

<?php return ob_get_contents(); }} // view ends here ?>

Таким образом, любой инструмент, который анализирует код (включая Psalm, но не ограничиваясь им), сможет его понять.

Другие вопросы по тегам