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

时间:2015-03-20 11:53:30

标签: php design-patterns refactoring

我有一个旧的PHP4网络应用程序,其中大多数页面看起来像这样(有些页面有左侧菜单,有些页面没有页脚):

<?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();
?>

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

1 个答案:

答案 0 :(得分:0)

我添加了一个方法,可能称之为renderColumn($tdParams = array()),它只能返回一个单独的td元素(作为字符串):

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

为了渲染数据库行,您可能(在稍后的时间点)具有包含更多或更少数据点的查询 - 因此将导致需要更多或更少td个单元格。

对于您的renderHeader方法,我会添加至少2个参数:title,也许可以添加<h2>,因为我可以看到频繁更改。