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个控制器:
示例网址的格式与此类似:
/backend(/:controller(/:id|:page)(/:action(/:parameter)))
Run Code Online (Sandbox Code Playgroud)
其中/backend部分是强制性的,但是controller是可选的.如果找到了控制器,那么id(或当你处理列表时页面)并且action是可选的.如果找到操作,则附加parameter是可选的.如果将其写为正则表达式,此结构将允许您处理大多数路由.
在开始使用或编写某种PHP框架之前,您应该学习如何编写适当的面向对象的代码.这并不意味着"知道如何写课".这意味着,您必须真正理解,什么是面向对象的编程,它基于什么原则,人们常犯的错误以及最常见的错误观念是什么.这里有一些可能对你有所帮助的讲座:
这应该给你一些关于这个主题的概述..是的,它很多.但怀疑你会更喜欢视频而不是书籍.否则,一些阅读材料:
您会注意到许多材料与语言无关.那是因为基于类的面向对象语言的理论是相同的.
extends在代码中注意关键字.这意味着" 是一个 ".没关系,class Oak extends Tree因为所有的橡树都是树木.但如果你有class User extends Database,有人可能会被冒犯.实际上有一个OOP原则可以讨论它:Liskov替换原理 ......也有一个非常简短的解释
如果这个项目有图像,我应该在哪里加载图像类来处理这些图像?我应该将它加载到 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,它提供了您尝试编写的大部分内容,此外,它还添加了我之前提到的缺少的组件;水合作用、对象关系和表类,以及许多其他功能,例如嵌套集。