HTML 模板中兼容 PSR-2 的内联 PHP 标签


PSR-2 compatible inline PHP tags in HTML templates

PSR-2没有提到任何适用于HTML模板中使用内联php标签的内容,但php-cs-fixer工具似乎有一个标准。

这是我的模板文件,在对它运行php-cs-fixer之前:

<nav>
    <ul>
        <li>
            <a href="#">Link</a>
<?php
if (! empty($subnav)) {
?>
            <ul class="subnav">
<?php
    foreach ($subnav as $link) {
?>
                <li><?=$link?></li>
<?php
    }
?>
            </ul>
<?php
}
?>
        </li>
        <li><a href="#">Link</a></li>
        <li><a href="#">Link</a></li>
    </ul>
</nav>

运行php-cs-fixer fix views/ui/nav.php --level=psr2后:

<nav>
    <ul>
        <li>
            <a href="#">Link</a>
<?php
if (! empty($subnav)) {
    ?>
            <ul class="subnav">
<?php
    foreach ($subnav as $link) {
        ?>
                <li><?=$link?></li>
<?php
    }
    ?>
            </ul>
<?php
}
?>
        </li>
        <li><a href="#">Link</a></li>
        <li><a href="#">Link</a></li>
    </ul>
</nav>

这看起来不对劲,所以我一定错过了什么。

  • 有没有正确的方法来编写符合PSR-2的内联PHP?
  • 使用 PHP 的替代语法来控制结构会有什么问题吗?同样,PSR-2 中没有提及,php-cs-fixer似乎对它们没有任何问题,但由于某种原因,它们感觉有点脏!

根据要求: 评论作为答案发布:

PSR只适用于PHP代码,它对内联HTML没有任何可说的,因为HTML根本不是PHP。

你得到的输出只是添加空格,根据标准,应该有空格- 开场{后的新行- {后的行使用 4 个空格缩进- ...

这就是为什么:

<?php
if(!empty($subnav)){//note no spaces
?>

将更改为:

<?php
if (!empty($subnav)) {
    ?>

foreach 代码中,您会注意到所有内容已经缩进了 4 个空格,因为代码位于 if 块内。

无论哪种方式,如果要将PHP混合到标记中,最好使用替代的,更友好的模板语法:

<?php
if (!empty($subnav)):
?>
//markup
<?php
    foreach ($subnav as $link):
        //do stuff
?>
//markup
<?php
    endforeach;
endif;
?>

请注意,结束标记的缩进可能仍然会被 php-cs-fixer 更改。也许像这样内联end<blockName>;

<?php endforeach; ?>