【问题标题】:Is it possible to write PHP in jade/pug?可以用jade/pug 编写PHP 吗?
【发布时间】:2017-02-03 11:40:37
【问题描述】:

有可能吗?如果是这样,怎么做? 如果不是,如果我需要在我的文档中编写 PHP,我是否必须放弃 pug? 在四处搜索后,我没有找到任何人解决这个问题。

【问题讨论】:

  • pug 是 JS 库吗?
  • 它是一个 html 模板。
  • 然后是前端。 PHP 是后端。
  • 其实不是前端,是后端。它是一个模板引擎,在发送到前端之前将其文件编译为 HTML。

标签: php html pug


【解决方案1】:

您可以将 PHP 嵌入到 Pug 模板中,就像您希望通过相对不受干扰的任何纯文本 [*] 一样。有a number of options covered in the docs,但我认为这些很可能是嵌入 PHP 的最佳选择:

  1. 在一个元素之后,它将正常工作。例如,p Good morning, <?php echo $user->name ?>
  2. 单独一行。由于任何以“<?php echo $foo; ?>)都可以正常工作。
  3. 多行 PHP 是它变得有点复杂的一种情况。如果您可以将其包装在 HTML 元素中,则可以使用 Pug 的块文本语法:在元素后添加一个点,然后在下面包含缩进的纯文本。

    p.
        <?php
        if ($multiline) {
            echo 'Foo!';
        }
        ?>
    

    如果你在元素之外需要它,另一种选择是在每一行前面加上一个管道:

    |<?php
    |if ($multiline) {
    |   echo 'Foo!';
    |}
    |?>
    

    (从技术上讲,由于上面的第 2 点,第一行不需要加前缀,但如果使用这种方法,我还是会为它加前缀以保持一致性。)

  4. 要在属性中使用 PHP,您只需要通过在等号前面加上一个 bang 来防止转义:p(class!="&lt;?php echo $foo ?&gt;")。 (有趣的是,对非转义属性值的支持是 added specifically for this use case。)

当然,默认情况下 .pug 文件被编译为 .html 文件,所以如果您使用它们来生成 PHP,您需要更改扩展名。一种简单的方法是使用 gulpgulp-puggulp-rename 插件来处理它们,看起来像这样:

var gulp = require('gulp'),
     pug = require('gulp-pug'),
     rename = require('gulp-rename');

gulp.task('default', function () {
    return gulp.src('./*.pug')
        .pipe(pug())
        .pipe(rename({
            extname: '.php'
        }))
        .pipe(gulp.dest('.'));
});

我没有与 Pug 进行过广泛的合作,所以我不知道在现实世界的用例中是否会出现任何潜在的问题,但上面所有的简单示例都可以按预期工作。

[*] Pug 仍然在纯文本上执行变量插值,但它使用#{variable} 格式,不应该与 PHP 的标准语法中的任何内容冲突。

【讨论】:

  • 我使用了这种方法,当我在开发简单的网站时,它对我有用。但是我遇到了一些问题 - 第一个是语法没有突出显示(编写大块的 php 代码之后很难阅读),第二个 - 在 pug 中对 php 内联代码提供本机支持会更好,即使在小型网站上我也遇到了一些问题在代码中,所以我必须采取一些奇怪的方式。在大型项目中,我确信按照您描述的方式在哈巴狗中使用 php 会非常困难
【解决方案2】:

由于 PHP 不关心“外部”代码是 HTML 还是任何特定的代码,您可以像往常一样简单地使用 PHP,并让它输出 Pug 格式的代码而不是 HTML。例如:

myPugTemplate.pug.php

html
  head
    title "<?= $this->title ?>"
  body
    <?php
      // Since we're outputing Pug markup, we have to take care of
      //   preserving indentation.
      $indent=str_repeat('  ', 2);
      if ($this->foo) {
        echo $indent . 'bar= myPost';
      } else {
        echo $indent . 'baz= myNav';
      }
    ?>
    footer
      +footerContent

如果您的 Pug 在服务器上进行处理,那么您还需要包含一个 Pug-processing 步骤,例如,如果您使用 Apache,您可以使用 mod_ext_filter 以这种方式配置并安装了pug-cli

ExtFilterDefine pug-to-html mode=output intype=text/pug outtype=text/html \
  cmd="pug"

<Location />
  SetOutputFilter pug-to-html
</Location>

【讨论】:

  • 我对这个问题的理解是,OP 试图从 Pug 模板中调用 PHP,而不是使用 PHP 来生成 Pug 模板。也就是说,webserver 很可能是 node.js 服务器而不是 apache。
  • 是的,我考虑过这一点,但是当你拥有的是 Node.js 服务器时,想要使用 PHP 会很奇怪:) 无论如何,拥有清晰的画面不会有什么坏处所有可用的可能性。
  • Pug 可以用作编写 HTML 的预处理器,就像 Sass 在编写 CSS 时一样,例如使用 gulp-pug。我不会假设 Pug 自动意味着 Node.js 服务器。
【解决方案3】:

您检查过pug-php 项目吗?我个人对这个特定模块没有经验,但它似乎正是你想要完成的事情:能够在 Pug 中使用 PHP。

【讨论】:

  • 据我了解,pug-php 允许 Pug 在 PHP 中用作模板引擎(就像您可能使用 Twig 一样),而不是相反。
  • pug-php 还允许您在 pug 模板中编写 PHP 代码,所以是的,可以这样做。
【解决方案4】:

您可以使用带引号的 scape 语法:

!{'<?php #php code  ?>'}

例如:

p Hello !{'<?php echo "My name"; ?>'}

将呈现:

<p>Hello <?php echo "My name"; ?></p>

你可以在这里测试它:https://pug-demo.herokuapp.com/

【讨论】:

    【解决方案5】:

    有一个用 PHP 原生编写的知名且维护良好的 Pug 处理器。您可以使用它来将您的 Pug 文件处理为 HTML,就像原始 Pug 一样,其优点是它允许您轻松地在 Pug 文件中嵌入和使用 PHP 代码。如果您在 Pug 中使用 PHP,请查看:

    Phug - the Pug template engine for PHP

    【讨论】:

    • 作者的问题有点不同。 Phug 允许在模板中使用 PHP 作为后端语言 - 用于使用循环、变量、对象等。作者和我正在寻找一种将 PHP 代码合并到“html 级别”的 pug 模板中的方法,这意味着输出常规的 php 代码编译后。
    【解决方案6】:
     p Hello !{'<?php echo "My name"; ?>'}
    

    有效但

     link(href="../assets/css/style.css?v=!{'<?=$AppsVersion?>'}" rel="stylesheet" type="text/css")
    

    不工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 2012-01-22
      • 1970-01-01
      相关资源
      最近更新 更多