PHP OOP核心框架

Mis*_*erM 5 php oop class object content-management-system

我刚发布这个问题,所以你们中的一些人可能会以正确的方式指出我.我正在慢慢升温到OOP,开始理解这个概念.我想建立一个良好的核心或基础,用作CMS后端.它也将使用MVC.我一直在使用http://gilbitron.github.com/PIP/作为MVC基础.

我无法弄清楚的事情如下:

比如说,在后端的项目页面上我有两个部分:htmltext和项目,我应该能够编辑它们.uri将类似于:// domain/backend/projects(该方法将是索引并显示2个部分)

当我点击项目时应该如何处理?// domain/backend/projects/projects /或// domain/backend/projects/list /

更进一步,项目将保存一些图像或图库://域/后端/项目/编辑/ 5 /图库/ 2

我的问题是,首先:这是一个很好的方法,更重要的是如何在OOP中实现

主要项目控制人:

class projects {

    function index(){
        // view index
    }

    function edit{
        $project = new Project();
        $projectdata = $project->load(5);
    }
}
Run Code Online (Sandbox Code Playgroud)

单个项目控制器

class project {

    function __construct(){
        $this->projectmodel = $this->loadModel('project_model'); // prepare the model to be used
    }

    function load($id){
        $this->projectmodel->loadproject($id);
    }
}
Run Code Online (Sandbox Code Playgroud)

项目模型

class project_model extends model { //extends for DB  access and such

    function __construct(){
        // do stuff
    }

    function loadproject($id){
        return $this->db->query("SELECT * FROM projects where id=" . $id . " LIMIT 1");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题.如果这个项目有图像,我应该在哪里加载图像类来处理它们?我应该在project_model中加载它,如$ this-> images = new Images(); 并在模型中有一个功能

function loadimages($id){
    $this->images->load($id);
}
Run Code Online (Sandbox Code Playgroud)

然后图像将是这样的:

class image extends model { //extends for DB  access and such 

    function __construct(){
    }

    function load($id){
        return $this->db->query("SELECT * FROM project_images where id=" . $id . " LIMIT 1");
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎控制器和模型以这种方式混淆了.然而,以合乎逻辑的方式,项目是一个容纳projectinfo的容器,可以是文本,图像和视频.我将如何在逻辑上进行设置.

ter*_*ško 23

原来的问题

关于URL的第一部分称为:路由或调度.在与Symfony 2.x的关系中有一篇相当不错的文章,但背后的想法才是最重要的.此外,您可能会研究其他框架如何实现它的方式.

对于原始URL示例,库将存储在DB中.不是吗?他们将拥有一个唯一的 ID.这使得这一点/backend/projects/edit/5/gallery/2毫无意义.相反,您的网址应该更像:

/backend/gallery/5/edit         // edit gallery with ID 5
/backend/project/3              // view project with ID 3
/backend/galleries/project/4    // list galleries filtered by project with ID 4
Run Code Online (Sandbox Code Playgroud)

URL应仅包含您真正需要的信息.

这也表明3个控制器:

  1. 单一画廊管理
  2. 单项目管理
  3. 处理画廊列表

示例网址的格式与此类似:

/backend(/:controller(/:id|:page)(/:action(/:parameter)))
Run Code Online (Sandbox Code Playgroud)

其中/backend部分是强制性的,但是controller是可选的.如果找到了控制器,那么id(或当你处理列表时页面)并且action是可选的.如果找到操作,则附加parameter是可选的.如果将其写为正则表达式,此结构将允许您处理大多数路由.

OOP超越课程

在开始使用或编写某种PHP框架之前,您应该学习如何编写适当的面向对象的代码.这并不意味着"知道如何写课".这意味着,您必须真正理解,什么是面向对象的编程,它基于什么原则,人们常犯的错误以及最常见的错误观念是什么.这里有一些可能对你有所帮助的讲座:

这应该给你一些关于这个主题的概述..是的,它很多.但怀疑你会更喜欢视频而不是书籍.否则,一些阅读材料:

您会注意到许多材料与语言无关.那是因为基于类的面向对象语言的理论是相同的.

PS

extends在代码中注意关键字.这意味着" 是一个 ".没关系,class Oak extends Tree因为所有的橡树都是树木.但如果你有class User extends Database,有人可能会被冒犯.实际上有一个OOP原则可以讨论它:Liskov替换原理 ......也有一个非常简短的解释


Mik*_*ell 2

如果这个项目有图像,我应该在哪里加载图像类来处理这些图像?我应该将它加载到 project_model 中,例如 $this->images = new Images(); 并在模型内部有一个函数

是的。该模型的目标是封装业务逻辑,以便您只需编写一次算法,并多次共享它们。如果我是你,我会做的就是getImages()向项目模型添加一个方法,因为图像是项目的直接属性,这使得每个项目都知道如何检索它自己的图像。

与我使用过的 ORMS(水合作用和对等/表)类相比,您的代码缺少一些关键概念,因此我将尝试坚持使用您的代码。您可以通过 Project 对象检索图像,然后通过视图引用图像(以下两种方式之一):

// Controller
$this->project = new Project();
$this->projectImages = $project->getImages(); // Implemenation #2

// View

// Implemenation #1 (reference to object initialized in controller)
<?php foreach ($project->getImages() as $image): ?>
<img src="<?php echo $image['path'] ?>" />
<?php endforeach ?>

// Implemenation #2 (reference to separate variable initialized in controller)
<?php foreach ($projectImages as $image): ?>
<img src="<?php echo $image['path'] ?>" />
<?php endforeach ?>
Run Code Online (Sandbox Code Playgroud)

以上仅是示范性的,但应该可以给您一个想法。我建议你看看Doctrine。它是一个经过验证且稳定的 ORM,它提供了您尝试编写的大部分内容,此外,它还添加了我之前提到的缺少的组件;水合作用、对象关系和表类,以及许多其他功能,例如嵌套集。