Php 面向最终用户的模板语言

Php 面向最终用户的模板语言,php,laravel,twig,Php,Laravel,Twig,在我的laravel应用程序中,我希望最终用户能够自定义一些电子邮件内容和一些页面内容 因此,在我的SaaS产品中,他们可以定制欢迎电子邮件,或者在有人加入平台后定制页面 我目前只是提供给他们一些占位符使用;即 Hello $FirstName$, 然后在我的代码中,我只做了 $content = str_replace(['$FirstName$', '....'... 这就是为什么我知道他们不会添加任何php或任何东西。但是,我需要执行一个if语句,并循环一个对象,这样我就达到了str_

在我的laravel应用程序中,我希望最终用户能够自定义一些电子邮件内容和一些页面内容

因此,在我的SaaS产品中,他们可以定制欢迎电子邮件,或者在有人加入平台后定制页面

我目前只是提供给他们一些占位符使用;即

Hello $FirstName$,
然后在我的代码中,我只做了

$content = str_replace(['$FirstName$', '....'...
这就是为什么我知道他们不会添加任何php或任何东西。但是,我需要执行一个if语句,并循环一个对象,这样我就达到了str_replace方法的极限


我不能使用blade,因为这允许他们使用
是的,twig支持使用加载不受信任的模板

sandbox
扩展可用于评估不受信任的代码。禁止访问不安全的属性和方法。沙盒安全性由策略实例管理。默认情况下,Twig附带一个策略类:
Twig\u Sandbox\u SecurityPolicy
。此类允许您将一些标记、筛选器、属性和方法列为白名单:

$tags = array('if');
$filters = array('upper');
$methods = array(
    'Article' => array('getTitle', 'getBody'),
);
$properties = array(
    'Article' => array('title', 'body'),
);
$functions = array('range');
$policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
然后您将使用它:


默认情况下,无法从细枝模板执行原始PHP,因此您的用户将无法过度滥用系统。它们仍然可能导致无限循环,但允许字符串替换的系统无法防止这种情况。

是的,twig支持加载不受信任的模板

sandbox
扩展可用于评估不受信任的代码。禁止访问不安全的属性和方法。沙盒安全性由策略实例管理。默认情况下,Twig附带一个策略类:
Twig\u Sandbox\u SecurityPolicy
。此类允许您将一些标记、筛选器、属性和方法列为白名单:

$tags = array('if');
$filters = array('upper');
$methods = array(
    'Article' => array('getTitle', 'getBody'),
);
$properties = array(
    'Article' => array('title', 'body'),
);
$functions = array('range');
$policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
然后您将使用它:


默认情况下,无法从细枝模板执行原始PHP,因此您的用户将无法过度滥用系统。它们仍然可能导致无限循环,但允许字符串替换的系统不能阻止这种情况。

相关问题?一个简单的搜索和替换就可以了。..。@SverriM.Olsen这就是我目前正在做的,但我现在想做一个if语句。@aug否,这是供客户端在电子邮件中使用的模板。他们可以在管理区定制。啊,我看到了我的缺点。你能详细说明一下你在循环对象和检查if语句时遇到的问题吗?我仍然不确定这是什么问题。相关问题?一个简单的搜索和替换就可以了。..。@SverriM.Olsen这就是我目前正在做的,但我现在想做一个if语句。@aug否,这是供客户端在电子邮件中使用的模板。他们可以在管理区定制。啊,我看到了我的缺点。你能详细说明一下你在循环对象和检查if语句时遇到的问题吗?我仍然不确定这有什么问题。是的,我认为这听起来像是一条路要走。通过查看文档,您将如何解析模板?没有这样的html文件,它将存储在DB中,因此需要将模板解析为字符串并返回它。是的,我认为这听起来像是一种方式。通过查看文档,您将如何解析模板?没有这样的html文件,它将存储在DB中,因此需要将模板解析为字符串并返回它。