2013-12-22 35 views
0

fetchdata.php - 发送所需的数据分离用户界面和数据库开发在PHP应用

function FetchItems() 
{ 
    while($Items = mysql_fetch_object("SELECT * FROM items")) //function is deprecated, would be changing it 
    { 
     $TotalItems[] = $Items; 
    } 
    return $TotalItems; 
} 

listitems.php - 用于用户界面和项目的列表显示给用户

require_once('fetchdata.php'); 
$Items = FetchItems(); 
echo '<table>'; 
foreach($Items as $ItemDetails) 
{ 
    echo '<tr>'; 
    echo '<td>'; 
    echo $ItemDetails->ItemName; // right now the UI developer requires the actual column names to display data but I don't want this 
    echo '</td>'; 
    echo '<td>'; 
    echo $ItemDetails->ItemQty; 
    echo '</td>'; 
    echo '<td>'; 
    echo $ItemDetails->ItemCost; 
    echo '</td>'; 
    echo '</tr>'; 
} 

echo '</table>'; 

我需要分开mysql开发和用户界面开发,以便在不同的人之间分配工作量。 UI开发人员不应要求实际的列名/表名/数据库名向用户显示数据。 但这些只会被后端开发者需要。

从一个开发者角度,如果万一我想改变我的表的列名一样,ItemQtyItemAvailableQty那么我要问的UI开发人员编辑UIE文件即listItems中。 PHP的,但我想,只有后端文件是fetchdata.php应该编辑和UI文件不应该被触及这种数据库的变化。无论数据库中发生了哪些变化,这些更改都应独立于UI文件,UI文件不应该知道/需要这些后端更改,即更改对于UI文件是不可见的。 UI文件只有当且仅当有一些UI改变时才会被编辑。

我应该采取哪些措施来实现这个目标?我是否需要创建视图/存储过程等?或者我必须去MVC框架,如果是的话,那么如何?

+1

首先,'mysql_ *'函数不再维护**,不应该用在任何新的代码库中。它正逐渐被淘汰,转而采用更新的API。相反,您应该使用[PDO](http://php.net/pdo)或[MySQLi]([**准备好的语句**])(https://www.youtube.com/watch?v=nLinqtCfhKY)( http://php.net/mysqli)。 –

回答

1

你不需要使用MVC框架,但它会比重新发明轮子更好。在MVC的全局概念中,您有一个View对象,它包含您的UI运行所需的变量。这取决于你实施它的方式。在View对象的大多数情况下,您需要一个魔术set方法,该方法将值分配给不存在的变量。

class View { 

    public function __set($name, $value) { 
     $this->$name = $value 
    } 

    public function __get($name) { 
     return $this->$name; 
    } 
} 

以非常简单的方式,如果您尝试将值设置为View的对象的不存在的属性,它将即时创建属性。

然后在你的后台交互,你有保存视图对象全局类,让我们不要把它应用程序,但是控制器。

class Controller { 

    protected $view; 

    public function __construct() { 
     $this->view = new View(); 
    } 
} 

没有魔力,只是通过保存View对象的所有后端交互的共享属性。

你现在有一类你FetchItems()方法,我们称之为,Items

所以,你创建一个使用数据库操作的控制器(MVC中的,这将是一个模型)和受让人返回值来查看的魔法属性。

class ItemsController extends Controller { 

    public function ItemsList() { 
     $items = new Items(); 
     foreach ($items->FetchItems() as $item) { 
      $this->view->ItemName[] = $item->ItemName; 
      $this->view->ItemQty[] = $item->ItemQty; 
      $this->view->ItemCost[] = $item->ItemCost[]; 
     } 
} 

因此,在这里,我们在您的Items模型的返回数据的View对象中创建了3个数组变量。这不会是最好的方法,因为UI开发人员应该使用一些后台功能与他们进行互动,所以你可能要创建一个大的阵列,它拥有他们像$this->view->Items['name'] = $item->ItemName$this->view->Items['Qty'] = $item->ItemQty,所以你只送出可变Items到视图。

现在,如果您更改列名称,则只需在业务逻辑中进行更改,您将在此创建$this->view->Items['qty'] = $item->ItemAvailableQty;,但在UI部分中,$this->Items['qty']将保留。

这当然不显示如何实现整个MVC,它只是显示你可以遵循的逻辑。当然,您可以使用现有的MVC框架,或者只是将您的应用程序改为具有共享变量,这样您的UI部分将从对象接收信息,该对象可以使用创建时的属性。因此,一旦将值分配给内部属性,您只需更改分配,但不需要在模板中使用的实际属性。

例如,在严格的OOP或框架中,您可以将值分配给包含FetchItems()方法的类的内部属性,以便您的UI开发人员使用它们而不是原始返回的数据库数据。

但是,最后,这不会让你花费更多时间并且值得吗?为了不让你的UI开发人员关心这些列,你将会使用数百万个指定来查看变量。数据库表不打算在挖掘时更改其列。更甚者,如果你已经在这张桌子后面有后端。

+0

谢谢先生,所以,根据你的说法,我将为Item创建一个类,然后在处理项时使用该类及其方法。然后,我将不得不只改变类文件中的列名而不是UI文件。但这种方法在UI文件中使用ClassName ...有没有一种方法可以避免在UI文件中使用类的名称.....就像Items - class,然后在UI文件中我会这样做 - $ item = new Items(); $用品 - > FetchItems(); – sqlchild

+0

也,你说我不需要MVC,为什么呢?但是你已经给出了我想的方法。 – sqlchild

+1

您可以在其中实例化类的外部文件,因此UI文件只需要它。 MVC是没有必要的,但是很好的解决方案,这就是为什么我给了这个方法:) –

1

您可以使用模板引擎,如SmartyTwig。它们确保了应用程序设计和逻辑之间的清晰分离。作为一个例子,我建议你看看Smarty的崩溃过程:http://www.smarty.net/crash_course

甚至可以将这样的模板引擎与MVC框架结合起来。