Псалом: как обрабатывать специальные файлы просмотра?
Моя установка включает
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;
}
}
В этой ситуации у меня в основном две проблемы с Псалом:
За
View::render
он сообщаетUnresolvableInclude
. Я даже могу напечатать$basename
с чем-то вроде@param "view1"|"view2"|"about" $basename
без эффекта. Остается неразрешимое включение.
В
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, но не ограничиваясь им), сможет его понять.