自定义php模板引擎:我终于走上了正轨吗?

时间:2008-10-12 23:39:26

标签: php xml template-engine conceptual

由于我一直很晚才回答标记为php的问题,我实际上知道答案,我想我会尝试自己提问。

我已经在php中对自定义模板引擎进行了如此多的完整重写,这么长时间以来,我以为我会征求意见。

简而言之,这是我迄今为止实施的最重要的部分:

  1. 任何http请求都会路由到handler.php
  2. 根据请求的URL,实例化控制器并调用该控制器上的方法。
  3. 控制器方法必须返回IView兼容的类实例(IView定义Render()方法)
    1. 模板引擎为以'serverside'sprintf('//%s:*[@runat="server"]', $namespaceprefix )
    2. 结尾的每个命名空间执行一些xpath
    3. 对于每个找到的标签,它会查找由$tag.localName标识的php类,并实例化一个并将其附加到原始模板。
    4. 连接后,原始模板节点将被送入“ServerTag”,以便正确初始化
    5. 将完全完整的IView兼容实例分配给控制器方法中的临时变量。
  4. 控制器要求将数据从Model类推送到视图,该视图会进行一些漂亮的xpath DOM替换。
  5. 控制器将完全填充的视图返回到处理程序的main(),处理程序将呈现它。
  6. 我的模板基于xml。一个简单的模板目前看起来像:

    <html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:red="http://www.theredhead.nl/serverside">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Title will be filed by the View depending on the Controller</title>
        <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Main/" />
    </head>
    <body>
        <!-- the entire body may be reset by the view using it, using XPath and DOM functions -->
        <!-- Usually the PageHeader and PageFooter would be put back after clearing the body  -->
        <div id="PageHeader">
            <img src="/Image/Get/theredhead_dot_nl.png" alt="Site Logo" />
        </div>
        <h1>www.theredhead.nl :: Test Template</h1>
        <p>
            Lorum ipsum dolar sit amet. blah blah blah yackadee schmackadee.
        </p>
    
        <div id="PageFooter">
            Built by
            <br />
            <red:UserProfileLink runat="server" Username="kris" />
        </div>
    </body>
    </html>
    

    当前,此输出(包括损坏的缩进):

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:red="http://www.theredhead.nl/serverside">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>Welcome to my site</title>
        <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Main/"/>
        <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Custom/"/>
        <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Profile/"/>
    </head>
    <body>
        <!-- the entire body may be reset by the view using it, using XPath and DOM functions -->
        <!-- Usually the PageHeader and PageFooter would be put back after clearing the body  -->
        <div id="PageHeader">
            <img src="/Image/Get/theredhead_dot_nl.png" alt="Site Logo"/>
        </div>
        <h1>www.theredhead.nl :: ModelViewController</h1>
        <p>
            Lorum ipsum dolar sit amet. blah blah blah yackadee schmackadee.
        </p>
    
        <div id="PageFooter">
            Built by
            <br/>
            <div><div xmlns:profile="http://www.theredhead.nl/profile" class="ProfileBadge" style="font-size : .8em;">
    <a style="text-decoration : none; border: none;" href="/Profile/View/kris">
        <img style="float : left;" src="http://www.gravatar.com/avatar/5beeab66d6fe021cbd4daa041330cc86?d=identicon&amp;s=32&amp;r=pg" alt="Gravatar"/>
        &#xA0;Kris
    </a>
    <br/>
    <small>
    &#xA0;Rep:&#xA0;1
    </small>
    </div></div>
        </div>
    </body>
    </html>
    
    • 我在这里只触及了冰山一角,是的,一旦我对功能感到满意,我将从输出中删除未使用的xmlns属性
    • 目前我的mvc和核心框架中只有200多个类
    • 我知道现有的解决方案可以做类似的事情,但我想建立自己的解决方案。

    所以最大的问题是:您对必备功能有任何意见吗?

    P.S。如果有人对完整的源代码感兴趣,请发表评论,当我达到合理的开发人员可用性水平时,我将在我的网站上提供。

3 个答案:

答案 0 :(得分:6)

为什么不使用PHP作为模板系统。 PHP IS 模板系统。

只是在HTML模板中转储<?php=$variable;?>有什么问题?你可以使用foreach循环等。 只需确保从无法访问任何您不想要的变量的范围内运行它。

由于我的Java / Struts噩梦,我对这样过于复杂的模板系统有着深深的仇恨。在更改所需的一项内容之前,您必须深入了解命名空间,xpath,自定义命名空间和所有这些内容。

答案 1 :(得分:1)

这是一篇关于模板引擎的文章:http://massassi.com/php/articles/template_engines/

你做错了。

答案 2 :(得分:1)

对我而言,只有Phil Reif真正阅读了才能理解这个问题及其意图。

那些声称php 的人是模板引擎,这忽略了太多的事实,并且在实体框架很重要的现实世界中蒙蔽了眼睛。

因此,到目前为止,这些点必须具有以下功能(尚未实现):

  1. 解释。我将处理类似于<asp:DataGrid>
  2. 的控件中的那些
  3. 验证。将使用验证控件进行处理。正则表达式,比较等。
  4. 输出强制有效xhtml 1.0,至少在html 5沉入之前。
  5. 复合自定义控件(基于xml模板而非代码)
  6. 内联php代码...我正在考虑它,<?php ... ?>是一个有效的xml DOMProcessingInstruction节点,但评委尚未决定。
  7. 可配置的全局异常处理。
  8. 我已经在网上设置了第一份草稿,所以你可以看一看,也许可以回复一些简洁的想法。

    顺便说一句,事情看起来我将在接下来的几天内建立并运行。目前它只是设计的初稿(代码和风格明智)

    仍然希望在这里有更多的输入,你们人们使用和喜爱什么样的控制? (来自任何框架/语言)

    克里斯