用于从PHP中的业务逻辑中提取HTML的任何好的设计模式


Any good design pattern to use for extracting HTML from business logic in PHP?

我有一个旧的PHP4 web应用程序,其中大多数页面都是这样的(有些页面有左菜单,有些页面没有页脚):

<?php
  echo "<html>";
  echo "<head><title>TITLE GOES HERE</title></head";
  echo "<body>";
  echo "<h2>THIS IS A TITLE</h2>";
  // Here i fetch data from DB
  echo "<table>";
  echo "<tr>";
  echo "</tr>";
  foreach($rowsFromDB as $row) {
    echo "<tr>";
    // here i echo some <td> containing $row data
    echo "</tr>";
  }
  echo "</table>";
  echo "</body>";
  echo "</html>";
?>

这是一个简单的例子,真正的例子包含了很多意大利面条代码(我是意大利人,我喜欢意大利面条,但不在我的代码中),我正在尝试以某种方式重构/重新设计它。从头开始重写整个应用程序(可能使用MVC框架)不是一种选择,因为该应用程序包含了很多我想保留的业务逻辑。我的想法(目前)是将echo封装在一个渲染器类中,类似于以下内容:

<?php
  class PageRenderer {
    public static function renderHeader() {
      echo "<html>";
      echo "<head><title>TITLE GOES HERE</title></head";
      echo "<body>";
      echo "<h2>THIS IS A TITLE</h2>";
    }
    public static function renderContent($rowsFromDB) {
      echo "<table>";
      echo "<tr>";
      echo "</tr>";
      foreach($rowsFromDB as $row) {
        echo "<tr>";
        // here i echo some <td> containing $row data
        echo "</tr>";
      }
      echo "</table>";
    }
    public static function renderFooter() {
      echo "</body>";
      echo "</html>";
    }
  }
  $renderer=new PageRenderer();
  $renderer->renderHeader();
  // Fetch data from DB
  $renderer->renderResults($rowsFromDB);
  $renderer->renderFooter();
?>

上述解决方案的问题是难以扩展和维护。你知道我可以用来进行更好的重构/重新设计的任何设计模式或技术吗?谢谢你的建议,很抱歉我的英语不好

我会添加一个方法,也许称之为renderColumn($tdParams = array()),它只具有返回单个td元素(作为字符串)的简单工作:

  • 初始化一个空字符串$td_cell
  • $td_cell添加一个打开的<td>标签,可以接受所述td标签的属性和值的数组作为参数$tdParams,该参数已被设置为空数组的默认值
  • $td_cell上附加一个结束的</td>标记
  • return $td_cell

为了呈现DB行,您可能(在稍后的时间点)有一个具有更多或更少数据点的查询,因此将导致需要更多或更少的td单元格。

对于您的renderHeader方法,我会添加至少两个参数:title,可能是您指定的<h2>,因为我可以看到这种情况经常发生变化。