1

我正在尝试将面向对象的方法应用于我的网站。

我有以下对象:

  1. 错误:处理所有错误,杀死致命错误的应用程序
  2. 数据库:处理数据库连接、查询等
  3. cookie:创建和读取cookies
  4. session:设置和获取会话变量,几乎处理会话
  5. 用户:处理我所有的用户信息(他连接了吗?他的 ip 已知吗?他的 id 是什么?等等)
  6. page:知道上面的所有对象,并根据 get 变量决定必须向用户显示的内容

通常,每个对象都传递它上面的对象。

我想要做的是有一个 page->render() 函数来渲染整个页面。

我有一个标题数组、一个页脚数组、一个元标记数组和一个脚本数组,渲染函数依次包含这些数组。该函数看起来像这样:

public function render(){
// to simplify im excluding meta tag and script arrays
    foreach($this->headers as $header){
        include $header;
        }

    //page sontents here

    foreach($this->footers as $footer){
        include $footer;
        }

我的问题是我应该如何渲染数据库数据,以便在调用渲染函数时而不是在包含视图时渲染它们?

例如,假设我有以下代码:

$result = mysql_query("SELECT SOME ENTRIES FROM DB");
while($row = mysql_fetch_assoc){
    include "views/show_the_entry.php";
    }

当调用 page->render() 函数时,我能做些什么来渲染它们?

我是不是把整个事情都想错了?如果是这样,有人可以提供有关此类 OO 实现理念的链接或一些信息吗?

4

3 回答 3

1

我见过的最常见的处理视图的方法是将视图创建为它自己的类。因此,您将从一个通用视图类开始,并使用您的模板名称对其进行实例化。

$view = new View('show_the_entry');

从那里,您可以设置查询中的所有相关数据。

while($row = mysql_fetch_assoc($rs)){
    $view->set('row', $row);
    echo $view->render();
}

这种方法有几个优点:

  • 您的视图是可以测试的离散单元。(虽然,我想,你也可以“测试”一个包含,它只是多一点......牛仔。)
  • 视图所依赖的数据必须显式传递到视图中。Usinginclude意味着包含的视图可以访问调用脚本中的所有变量。使用View类将范围隔离到您传入的内容。
  • 该类View在内部仍然可以简单地包含文件::render(这是我见过的最常见的实现)。但是,通过强制视图只使用它所需要的,并明确地将数据传递给它,您可以获得代码隔离、可重用性和可测试性。
于 2012-04-13T15:18:41.667 回答
1

首先,我不知道你在哪里学会使用 mysql 和 php,但那个网站很旧。真的老了。您不应该使用古老的mysql_*函数编写任何新代码。它们不再被维护,PHP 社区已经开始弃用它们。相反,您应该将PDO pr MySQLi与准备好的语句一起使用。新的 API 实际上是面向对象的,这意味着您的“数据库类”也有点过时了。

要学习 PDO,你可以去这里.. 至于 MySQLi:我不知道。

也就是说,我真的怀疑您是否应该针对这种情况制定一个成熟的 MVC 架构。你应该远离框架。

您真正需要的是实现一种简单的模板化方法并废除 Java 样式On-class-to-contain-them-all .. 或者您称之为:Page.

而是使用一个简单的脚本 .. 像这样:

$connection = new PDO('mysql:...');

$user = new User( $connection );
if ( $user->hasLoggedOn() )
{
    $template = new Template('overview');
    $collection = new Entities( $connection );
    $template->bind( 'list', $collection->getSome() );
}
else
{
    $template = new Template('error-page');
}

echo $template->render();

不,这不能称为 MVC 或任何类似 MVC 的东西,因为View不应该是一个模板,而是一个类的实例,它处理表示逻辑并处理多个模板。在该架构模式的 Model2 MVC(也称为 Web MVC)版本的情况下,视图实例从模型层中的域对象请求信息。

但正如我已经提到的,在这种情况下实现 MVC 将是矫枉过正。此外,在您开始深入研究 MVC 之前,您应该了解什么是SOLID 原则依赖注入

于 2012-04-15T22:34:07.837 回答
0

广泛用于此问题的普遍模式是模型-视图-控制器模式。
我认为这就是您正在寻找的东西,但我建议您使用已经解决了这些问题的框架。Symfony 2、Yui 和 Zend 都是很好的框架,你应该使用哪一个取决于你需要构建的站点

于 2012-04-13T14:52:56.373 回答