【问题标题】:Separating Logic/Style in PHP properly正确分离 PHP 中的逻辑/样式
【发布时间】:2011-03-09 14:47:29
【问题描述】:

我只是想知道在 PHP Web 项目中将逻辑组件与布局分开的最​​佳方法是什么?

内容存储在 MySQL 中,逻辑是 PHP,模板当然是 HTML/CSS。 我的问题是,如何最好地解决这个问题(不使用 CMS)。

打个招呼

【问题讨论】:

  • (tipp) 环顾 SO 寻找 MVC

标签: php templates layout


【解决方案1】:

使用Template Engine,例如Smarty

或者只使用带有嵌入 php 的 HTML 作为模板,只是注意不要在模板中放入太多逻辑。

【讨论】:

    【解决方案2】:

    只需使用一些模板引擎。
    最熟悉的就是 PHP 本身。

    这是一个非常基本的 CRUD 应用示例:
    只做数据操作的逻辑部分

    <?  
    mysql_connect(); 
    mysql_select_db("new"); 
    $table = "test"; 
    if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part: 
      $name = mysql_real_escape_string($_POST['name']); 
      if ($id = intval($_POST['id'])) { 
        $query="UPDATE $table SET name='$name' WHERE id=$id"; 
      } else { 
        $query="INSERT INTO $table SET name='$name'"; 
      } 
      mysql_query($query) or trigger_error(mysql_error()." in ".$query); 
      header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);  
      exit;  
    }  
    if (!isset($_GET['id'])) { //listing part: 
      $LIST=array(); 
      $query="SELECT * FROM $table";  
      $res=mysql_query($query); 
      while($row=mysql_fetch_assoc($res)) $LIST[]=$row; 
      include 'list.php'; 
    } else { // form displaying part: 
      if ($id=intval($_GET['id'])) { 
        $query="SELECT * FROM $table WHERE id=$id";  
        $res=mysql_query($query); 
        $row=mysql_fetch_assoc($res); 
        foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v); 
      } else { 
        $row['name']=''; 
        $row['id']=0; 
      } 
      include 'form.php'; 
    }  
    ?>
    

    还有两个负责输出的简单模板,
    form.php

    <? include TPL_TOP ?>
    <form method="POST">
    <input type="text" name="name" value="<?=$row['name']?>"><br>
    <input type="hidden" name="id" value="<?=$row['id']?>">
    <input type="submit"><br>
    <a href="?">Return to the list</a>
    </form>
    <? include TPL_BOTTOM ?>
    

    和list.php

    <? include TPL_TOP ?>
    <a href="?id=0">Add item</a>
    <? foreach ($LIST as $row): ?>
    <li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
    <? endforeach ?>
    <? include TPL_BOTTOM ?>
    

    虽然有很多其他模板引擎,不同种类和意识形态。

    【讨论】:

    • 作为旁观者,PHP代码是否必须只存在于被服务的页面中,还是可以分离成类似支持类库的东西?
    • @jdk PHP 可以 include() 或 require() 附加文件,例如函数库或类库
    【解决方案3】:

    尝试类似的 MVC 框架

    代码点火器: http://codeigniter.com/

    或 CakePHP: http://cakephp.org/

    (Cake 的学习曲线更陡峭,但会自动完成更多工作)

    以下是 MVC 的内容: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      相关资源
      最近更新 更多