PHPStan анализирует представления с помощью ViewModel
Я имею Views
а также ViewModels
с большим количеством PHP-Magic в моем приложении. Я хочу избавиться от этой магии, не ломая слишком много. Итак, я хочу проанализироватьViews
с PHPStan
перед.
Представление выглядит так, это старый добрый PHP.
<?= $headline ?>
<?php
// ....
?>
Переменная объявлена в другом месте модели представления, и файл включен в нее (между ними еще несколько слоев, что затрудняет анализ).
А ViewModel
выглядит вот так.
class MyViewModel extends ViewModel {
$headline = 'myHeadline';
}
Вот и подумал о взломе. Я хотел добавить вызов функции (или аннотацию) к каждомуView
который определяет, откуда брать переменные.
Это моя попытка.
Правило PHPSTan:
final class VariableInViewRule implements Rule
{
public function getNodeType(): string
{
return Node\Expr\FuncCall::class;
}
public function processNode(Node $funcCall, Scope $scope): array
{
if ((string) $funcCall->name !== 'import_viewmodel_scope') {
return [];
}
$viewModelClass = (string) $funcCall->args[0]->value->class;
$viewModel = new ObjectType($viewModelClass);
$scope->assignVariable('this', $viewModel);
$viewModelReflection = $viewModel->getClassReflection();
$reflectedProps = $viewModelReflection->getNativeReflection()->getProperties(
ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_PRIVATE
);
foreach ($reflectedProps as $prop) {
$propType = $viewModel->getProperty($prop->getName(), $scope);
$scope->assignVariable($prop->getName(), $propType->getReadableType());
}
return [];
}
}
и мой измененный вид
<?php
import_viewmodel_scope(MyViewModel::class);
?>
<?= $headline ?>
Теперь он не распознает переменную, и я действительно не знаю, как "имитировать", что переменная существует для анализа PHPStan.
Кто-нибудь из вас намекнет мне, что я сделал не так? А может есть способ куда проще?
(Помните, я хочу проанализировать его перед рефакторингом, потому что у меня там огромный беспорядок, который мгновенно ломается, когда вы его касаетесь)
Заранее большое спасибо.