微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Psalm:如何处理专用视图文件?

如何解决Psalm:如何处理专用视图文件?

我的设置包括一个带有类的 lib 文件夹和一个带有 PHP 文件view 文件夹,用于生成输出。这些视图被导入到一个类似于这样的 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;
    }

}

在这种情况下,我对 Psalm 基本上有两个问题:

  1. 对于 View::render,它报告一个 UnresolvableInclude。我什至可以输入 $basename 类似

     @param "view1"|"view2"|"about" $basename
    

    没有效果。无法解析的包含仍然存在。

  2. extract()$params内容放在包含视图文件的本地范围内。这让我有

     <?=escape($foo)?>
    

    在我的视图文件中使用 $params === ['foo' => 'bar']标记”。然而,Psalm 并没有赶上这一点,并报告了很多 UndefinedGlobalVariable 问题。

我的问题:我如何将视图文件和变量告诉 psalm?或者,我如何重新构建此代码,以便 psalm 可以为我测试?

解决方法

在 Psalm 的 repo 中有一个演示 TemlateChecker plugin,它似乎做了类似的事情:它查看视图文件中的 docblock 以获取像 @variablesfrom ClassName::method 这样的标签,并使它们在模板文件中可用。或者只是来自该方法的 $this 变量的属性,不确定。 Psalm 文档中也提到了这一点:Checking non-PHP files

或者,您可以将模板包装到一个最小的方法/函数中,因为从技术上讲,视图只是一个接受一堆变量并返回一个字符串的函数: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)都能够理解它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?