我只是发布这个问题,所以你们中的一些人可能能够以正确的方式指出我。我正在慢慢熟悉 OOP,开始理解这个概念。我想做一个好的坚实的核心或基础来用作 CMS 后端。它还将使用 MVC。我一直在用http://gilbitron.github.com/PIP/作为 MVC- 基础。
我想不通的是:
说,在后端的项目页面上,我有 2 个部分:htmltext 和项目,我应该能够编辑它们。 uri 类似于: //domain/backend/projects(该方法将是索引并显示 2 个部分)
当我点击项目时应该如何处理? //域/后端/项目/项目/或 //域/后端/项目/列表/
更进一步,一个项目将包含一些图像或画廊: //domain/backend/projects/edit/5/gallery/2
我的问题是,首先:这是一个好方法吗?更重要的是如何在 OOP 中实现它
主要项目负责人:
class projects {
function index(){
// view index
}
function edit{
$project = new Project();
$projectdata = $project->load(5);
}
}
单个项目 Controller
class project {
function __construct(){
$this->projectmodel = $this->loadModel('project_model'); // prepare the model to be used
}
function load($id){
$this->projectmodel->loadproject($id);
}
}
项目模型
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");
}
}
现在我的问题。如果这个项目有图像,我应该在哪里加载图像类来处理这些图像?我应该将它加载到 project_model 中吗 $this->images = new Images();并在模型中有一个函数
function loadimages($id){
$this->images->load($id);
}
然后图像会是这样的:
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");
}
}
Controller 和模型似乎以这种方式混淆了。然而,从逻辑上讲,项目是一个包含项目信息的容器,项目信息可以是文本、图像,也可能是视频。我将如何从逻辑上进行设置。
最佳答案
原始问题
关于 URL 的第一部分称为:路由或调度。有相当不错article关于它与 Symfony 2.x 的关系,但它背后的想法才是最重要的。此外,您可能会了解其他框架如何实现它。
至于您的原始 URL 示例,图库将存储在数据库中。他们不会吗?他们将拥有一个唯一 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
URL 应该只包含您真正需要的信息。
这也表示有 3 个 Controller :
- 单一画廊管理
- 单一项目管理
- 处理画廊列表
示例 URL 的模式类似于:
/backend(/:controller(/:id|:page)(/:action(/:parameter)))
其中 /backend
部分是必需的,但 controller
是可选的。如果找到 Controller ,则 id
(或页面,当您处理列表时)和 action
是可选的。如果找到操作,则附加 parameter
是可选的。如果写成正则表达式,这种结构可以让您处理大部分路由。
OOP 超越类
在开始使用或编写某种 PHP 框架之前,您应该学习如何编写正确的面向对象代码。这并不意味着“知道如何编写类(class)”。它意味着,您必须真正理解什么是面向对象编程、它基于什么原则、人们常犯的错误是什么以及最普遍的误解是什么。以下是一些可能对您有所帮助的讲座:
- Inheritance, Polymorphism, & Testing
- Advanced OO Patterns ( slides )
- Unit Testing
- The Principles of Agile Design
- Global State and Singletons
- Don't Look For Things!
- Beyond Frameworks ( slide )
- Agility and Quality ( slides )
- Clean Code I: Arguments
- Clean Code III: Functions
这应该让您对该主题有一些概述.. 是的,它很多。但是我怀疑您会更喜欢视频而不是书籍。否则,一些阅读 Material :
- PHP Object-Oriented Solutions
- Design Patterns Explained
- Patterns of Enterprise Application Architecture
您会注意到很多资料都与语言无关。这是因为基于类的面向对象语言的理论是相同的。
附言
请注意代码中的 extends
关键字。它的意思是“是一个”。如果 class Oak extends Tree
没问题,因为所有的橡树都是树。但是如果您有 class User extends Database
,有人可能会被冒犯。实际上有一个 OOP 原则在谈论它:Liskov substitution principle ..还有一个很short explanation
关于PHP OOP核心框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9846220/