面向对象的页面呈现

时间:2012-04-13 14:48:11

标签: php oop templates

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

我有以下对象:

  1. 错误:Hadles所有错误,杀死致命的应用程序
  2. 数据库:处理数据库连接,查询等
  3. cookie:创建和读取cookie
  4. session:设置并获取会话变量,几乎是句柄 会话
  5. user:处理我的所有用户信息(他连接了吗?是他的ip 知道了吗?他的身份是什么?等)
  6. page:知道上面的所有对象,并基于get变量 决定必须向用户显示的内容
  7. 通常,每个对象都传递给它上面的对象。

    我要做的是,有一个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;
            }
    

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

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

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

    当调用page-> render()函数时,我该怎么做才能渲染它们?

    我是否认为整件事都错了?如果是这样,有人可以提供关于此类OO实施的理念的链接或信息吗?

3 个答案:

答案 0 :(得分:1)

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

$view = new View('show_the_entry');

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

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

这种方法有一些优点:

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

答案 1 :(得分:1)

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

对于学习PDO,你可以go here ..对于MySQLi:我不知道。

那就是说,我真的怀疑你应该为这个案例瞄准一个完整的MVC-ish架构。你应该远离框架。

你真正需要的是实现a simple way for templating并取消Java样式 On-class-to-contain-all-all ..或者你所谓的:{{1 }}

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

Page

不,这不能称为MVC或任何类似MVC的东西,因为 View 不应该是一个模板,而是一个类的实例,它处理表示逻辑并且处理多个模板。对于该架构模式的Model2 MVC(也称为--Web MVC)版本, View 的实例从Model层中的 Domain Objects 请求信息。

但正如我已经提到的,在这种情况下实施MVC将是过度的。此外,在您开始深入了解MVC之前,您应该了解SOLID principlesDependency Injection是什么。

答案 2 :(得分:0)

广泛用于此问题的无处不在的模式是Model-view-controller模式 我认为这就是你要找的东西,但我建议你使用一个已经解决了这些问题的框架。 Symfony 2,Yui和Zend都是很好的框架,你应该使用哪一个取决于你需要构建的网站