PHPStan анализирует представления с помощью ViewModel - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть 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.

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

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

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

...