У меня есть Views
и ViewModels
с большим количеством PHP -Magi c в моем приложении. Я хочу избавиться от этой магии c, не ломая слишком много. Поэтому я хочу проанализировать Views
с PHPStan
раньше.
Представление выглядит так, оно просто старое PHP.
<?= $headline ?>
<?php
// ....
?>
Переменная объявлена в другом месте в ViewModel и Файл включены в него (еще несколько слоев между ними, что затрудняет анализ).
A 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.
Кто-нибудь из вас намекает на то, что я ошибся? Или, может быть, есть более простой способ?
(Помните, я хочу проанализировать его перед рефакторингом, потому что у меня там огромный беспорядок, который мгновенно разрывается при прикосновении к нему)
Заранее большое спасибо.