mgrn / scoperender
一个处理作用域渲染的基本库。
Requires
- php: >=8.1
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ^9.5
README
一个提供简单且安全的作用域渲染的基本库
关于
scoperenderer库将按如下方式渲染部分内容,使得部分的作用域完全位于Scope类型的一个类中。Scope可以扩展来自定义属性或方法。使用ScopeRenderer渲染部分内容,它具有处理现有缓冲内容的机制。此外,库中包含一些基本的转义器来清理输出,尽管您可以扩展这些或创建自己的。
ScopeRenderer
这是一个基本类,用于渲染部分内容。请注意,部分可以是任何文件,并不限于php/phtml。您可以渲染js、ts或其他输出。当实例化ScopeRenderer时,需要一个目标目录,部分内容就位于该目录中。在渲染输出时,ScopeRenderer将确保没有部分位于基础目录之外,并且不允许路径操作以超出根目录。
这设置了一个基本的渲染器,其中部分内容将存储在当前目录下名为'partials'的目录中。第二个参数定义了部分的扩展名。默认设置为'phtml',这里包含它以供参考。
$partialDir = __DIR__.DIRECTORY_SEPARATOR.'partials'
$scopeRenderer = new ScopeRenderer($partialDir,'phtml');
假设您有一个特定的作用域,$scope,以及您希望渲染的部分,'mypartial.phtml',您将得到如下渲染内容:
$scopedOutput = $scopeRenderer->render('mypartial',$scope);
然后您会根据需要输出$scopedOutput。如果您有一个缓冲区,则输出不会改变缓冲区,并且您的输出不会添加到缓冲区中!
ScopeRenderer不允许渲染根目录之外的部分,所以这将失败:
$scopedOutput = $scopeRenderer->render('..\mypartial',$scope);
Scope
Scope类是在渲染期间部分内容看到的作为$this的类。您应该确保您的Scope类具有部分内容所需的所有方法和属性。默认情况下,Scope类将有一个名为escape()的方法,它提供了BasicEscaper类。您可以依赖它,也可以扩展BasicEscaper并自行提供转义器实现。基本的转义器提供了JavaScript转义方法和HTML转义方法。HTML转义器是一个白名单转义器,这意味着在转义值时,任何不匹配传递参数的内容都将被删除或转义。基本类中的参数如下:
- $encodeAll - 尝试编码所有内容,同时尊重底层编码。字符串通过私有方法encodeAll运行。
- $preserveFormatters - 如果$encodeAll为false,则相关。如果此参数为true,则尝试保留所有与提供的模式匹配的内容不变,并编码其余内容。如果为false,则删除任何匹配的模式,并编码其余内容。默认情况下,使用BasicEscapeHtmlPatterns类中的常量,例如,如果$encodeAll为false且$preserveFormatters为true,则“<img src="foo.png"> an image”中的img标签将保持未转义,因为它通过BASIC_PATTERN_IMAGES模式匹配,但如果$preserveFormatters为false,则它将完全从字符串中删除,留下“ an image”。
默认转义器会注入到任何提供给渲染的作用域中,除非作用域已经设置了转义器,例如通过调用setEscaper()。
如果您不想使用库中的base escapers,则可以将ScopeAbstract扩展到您自己的基本作用域类中,更新您的作用域类中的escape()方法以具有正确的返回类型,然后可以通过在scopeRenderer上调用setEscaper()使用您自己的escaper,或者在每个作用域渲染之前自行注入escaper。escaper接口是一个空接口,对escaper的行为没有要求,尽管在现实中,您的escaper应该有公共方法,这些方法对提供的值执行一些有用的操作。
部分
对于您渲染的任何作用域,您需要一个部分或文件来输出内容。部分可以期望在作用域中存在一个变量,即$ this,其中$ this是提供的作用域类。这意味着部分也应该能够访问作用域的属性,包括公共和私有属性,以及作用域的方法,包括escaper。
在更高级的使用中,您可能有多个基本作用域,这样提供给部分的作用域escapers就可以定制化,只为该类型部分提供有用的方法,例如,HTML部分不与JavaScript部分、JSON部分或XML部分具有相同的作用域escaper。
默认情况下,库没有提供在部分内初始化新部分渲染的方法,即子部分,但这很容易实现。要实现这一点,您可以将接受作为构造函数参数或通过方法调用的作用域渲染器的作用域作为参数,并提供对render()方法的访问。请注意,直接提供对scopeRenderer类本身的访问不是好的做法,而应让您的范围实现它自己的渲染方法,以便隐藏对其他方法的访问,例如setRenderRootFolder()。