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.

Кто-нибудь из вас намекнет мне, что я сделал не так? А может есть способ куда проще?

(Помните, я хочу проанализировать его перед рефакторингом, потому что у меня там огромный беспорядок, который мгновенно ломается, когда вы его касаетесь)

Заранее большое спасибо.

0 ответов

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