我是否可以避免在电子邮件中使用PHP之上构建的模板引擎作为逻辑?

我是否可以避免在电子邮件中使用PHP之上构建的模板引擎作为逻辑?,php,Php,我想保存一个模板,但我需要它里面的逻辑。这是一封HTML电子邮件,顺便说一句,这就是我使用表格的原因 <p>Dear {{first}} {{last}} </p> <table> {{ if something }} <tr><td></td></tr> {{ endif }} </table> 基本上,我想用来自数据库的相应值填充{{variables}} 我希望有一个if,以避免

我想保存一个模板,但我需要它里面的逻辑。这是一封HTML电子邮件,顺便说一句,这就是我使用表格的原因

<p>Dear {{first}} {{last}} </p>

<table>



{{ if something }} 
<tr><td></td></tr>

{{ endif }}

</table>
基本上,我想用来自数据库的相应值填充{{variables}}

我希望有一个if,以避免存储2个版本的模板。有没有更简单的方法?我希望避免编写模板处理器


或者我应该只存储两个版本的模板,因为它们是不同的吗?

是否可以使用现有的模板处理器

我会尝试从他们的网站复制内容:

index.tpl:

<html>
<head>
<title>Info</title>
</head>
<body>

<pre>
User Information:

Name: {$name}
Address: {$address}
</pre>

</body>
</html>

是否可以选择使用现有的模板处理器

我会尝试从他们的网站复制内容:

index.tpl:

<html>
<head>
<title>Info</title>
</head>
<body>

<pre>
User Information:

Name: {$name}
Address: {$address}
</pre>

</body>
</html>

我认为原始PHP模板方法适合这里。您可以这样轻松地定义电子邮件模板:

function email_template($file, $vars) {
    ob_start();
    extract($vars);
    include($file);
    return ob_get_contents() . (ob_end_clean() ? "" : "");
}
您当然可以调整参数传递,但基本调用是:

<p>Dear {{first}} {{last}} </p>
<table>
    {{ if something }} 
        <tr><td></td></tr>
    {{ endif }}
</table>

优点是,您可以在这样的模板中使用任何复杂的PHP控制结构,而不会牺牲可读性,因为您只需要很少的实例和变量名。

我认为原始PHP模板方法适合这里。您可以这样轻松地定义电子邮件模板:

function email_template($file, $vars) {
    ob_start();
    extract($vars);
    include($file);
    return ob_get_contents() . (ob_end_clean() ? "" : "");
}
您当然可以调整参数传递,但基本调用是:

<p>Dear {{first}} {{last}} </p>
<table>
    {{ if something }} 
        <tr><td></td></tr>
    {{ endif }}
</table>

优点是,您可以在这样的模板中使用任何复杂的PHP控制结构,而不牺牲可读性,因为您只需要很少的实例和变量名。

首先让我解释一些事情,您可能已经知道了这些,但我将为其他用户/读者的目的进行解释

创建模板解析器不是一个坏主意,因为它只是用相应的值替换实例if{key},但是当您进入逻辑解释,例如{{if a>b&&c 如果它只是一个值替换,那么它是一个简单的数组str_repalce,这是非常有效的,我会说是的,去吧。。。但我不是

PHP是作为逻辑解释器构建的,由于这是语言的低端,因此与构建在解释器之上的解释器相比,它速度更快,资源消耗更少

您应该做的是对PHP代码进行沙盒处理,从而有效地成为一个独立的解释器

因此,让我们从一些代码和模板开始,让我们从您的示例开始

<p>Dear <? echo $this->getFullName() ?> </p>
<table>
    <? if($this->getSomething()): ?>
        <tr><td></td></tr>
    <? endif; ?>
</table>
现在,模板类将用于设置/获取要传递到沙箱的项,如first name、last name。 TemplateRenderer是沙箱,在沙箱中编译代码并作为字符串返回。
如果您希望我继续,并填写上面缺少的代码块,那么只需发表评论。

首先让我解释一些事情,您可能已经知道了这些,但我将为其他用户/读者的目的进行解释

创建模板解析器不是一个坏主意,因为它只是用相应的值替换实例if{key},但是当您进入逻辑解释,例如{{if a>b&&c 如果它只是一个值替换,那么它是一个简单的数组str_repalce,这是非常有效的,我会说是的,去吧。。。但我不是

PHP是作为逻辑解释器构建的,由于这是语言的低端,因此与构建在解释器之上的解释器相比,它速度更快,资源消耗更少

您应该做的是对PHP代码进行沙盒处理,从而有效地成为一个独立的解释器

因此,让我们从一些代码和模板开始,让我们从您的示例开始

<p>Dear <? echo $this->getFullName() ?> </p>
<table>
    <? if($this->getSomething()): ?>
        <tr><td></td></tr>
    <? endif; ?>
</table>
现在,模板类将用于设置/获取要传递到沙箱的项,如first name、last name。 TemplateRenderer是沙箱,在沙箱中编译代码并作为字符串返回。
如果您希望我继续,并填充上面缺少的代码块,请发表评论。

为什么要避免使用模板处理器?潜在的错误?时间复杂性因素?我相信我能很快地写出一个原始版本,但也许有一个稳定的版本。或者我不需要它?只需使用一个includeemail-template.php输出文本,用ob_start/ob_get_内容修饰即可获得邮件内容。@mario-这是我目前使用的,但我没有使用ob_get_内容。你能解释一下这有什么好处吗?显然,我从来没有学过ob_get_内容背后的诀窍。为什么要避免使用模板处理器?潜在的bug?时间复杂性因素?我相信我能很快地写出一个原始版本,但也许有一个稳定的版本。或者我不需要它?只需使用includeemail-template.php输出文本,de
用ob_start/ob_get_内容装饰以获取邮件内容。@mario-这是我目前正在使用的内容,但我没有使用ob_get_内容。你能解释一下这有什么好处吗?显然,我从来没有学过ob_get_内容背后的诀窍。是的,是的。不过我更喜欢轻量级的。Smarty使用了太多的资源,以至于不得不开发一个缓存系统来帮助解决服务器上的大量压力。是的,的确如此。不过我更喜欢轻量级的。Smarty使用了太多的资源,以至于不得不开发一个缓存系统来帮助解决它在服务器上造成的巨大压力。你能解释一下在功能范围内ob_start的意义吗?它只是开始了另一层的范围或什么的?是的。它启动一个输出缓冲区。这可以防止任何回显/打印或原始html输出离开PHP。它将其保存在一个内部缓冲区中,然后可以通过ob_get_contents/flush读取。ob_start捕获模板创建的输出,因此它不会像这样回显到直接输出流,这使您能够快速编译带有PHP值的html,并能够将其全部捕获为字符串?它只是开始了另一层的范围或什么的?是的。它启动一个输出缓冲区。这可以防止任何回显/打印或原始html输出离开PHP。它将其保存在一个内部缓冲区中,然后可以通过ob_get_contents/flush.ob_start读取模板创建的输出,因此它不会像这样回显到直接的输出流中,这允许您使用回显的PHP值快速编译html,并能够以字符串的形式捕获所有内容。
<p>Dear <? echo $this->getFullName() ?> </p>
<table>
    <? if($this->getSomething()): ?>
        <tr><td></td></tr>
    <? endif; ?>
</table>
class Template
{
     
}

class TemplateRenderer
{
     
}