所以,几周以来,我一直在玩我自己的PHP MVC框架,纯粹是为了学习目的。我已经完成了基础知识,我想我知道会发生什么,等等。但到目前为止,我还没有弄清楚以下内容。
假设我有一个音乐数据库,我有一个"音乐控制器",一个"音乐模型"显然是一个"音乐视图"。我最终想要做的是,能够当然插入新的艺术家和/或新的曲目,我也希望能够编辑它们,等等。我的网址如下:
example.com/controller/mainfunction
在我的"音乐控制器"我有一个方法如下:
public function addTrack()
{
if (isset($_POST["submit_add_track"]))
{
// call the model to add track to database etc..
}
}
所以,如果我在我的"音乐视图中有一个表格"并提交,我可以添加一个新的轨道到数据库。我还有一种添加新艺术家的方法,等等。
但这是我正在努力的事情。我该如何设计呢?我应该使用音乐控制器添加曲目和艺术家吗?像这样:
example.com/music/add/artist
example.com/music/add/track
或者我应该采用不同的方式,也许我应该使用"音乐控制器"只是为了显示艺术家和曲目,并插入其他控制器的东西?像这样:
example.com/insert/artist
example.com/insert/track
后者似乎是我的选择,但我不确定这是不是很好的设计。
我想也许我要问的是,使用"插入"是不是很好控制器,然后一个"跟踪方法"显示"插入曲目"形式在视图中?接下来,将会有更多的页面,而不仅仅是音乐。但我无法弄清楚如何正确地做到这一点背后的逻辑,所以我可以轻松扩展。
正如你所看到的,我迷失了,任何指针(大或小)都会对我有所帮助。在此先感谢!!
修改 所以,只是为了看看我现在是否在正确的轨道上。我有一个音乐控制器,下面粘贴了代码。如果在控制器中" addArtist"方法被调用,它进入模型,将艺术家添加到数据库,向控制器返回一些东西,然后完成。现在我还有麻烦的部分。如何显示表单以实际添加艺术家?我知道它应该在视野中。但是我应该怎么称呼它?像这样的东西?
example.com/music/insertArtist
这可行,但后来我会有一个" insertArtist"方法,仅用于显示表单,以及" addArtist"方法,用于在每次提交表单时将新艺术家实际插入数据库。我知道我错过了一些东西,但我还是无法解决这个问题。我想的是,在" addArtist"方法,我包括" addArtist"查看要显示的文件,其中包含表单,我放入了一些"如果提交,则添加艺术家"。这是否有意义,如果是的话,我是否走错了路?
public function addArtist()
{
// $artist_model->addArtist();
}
public function editArtist($artistID)
{
// $artist_model->editArtist();
}
public function deleteArtist($artistID)
{
// $artist_model->deleteArtist();
}
public function addTrack()
{
// $artist_model->addTrack();
}
public function editTrack($trackID)
{
// $artist_model->addTrack();
}
public function deleteTrack($trackID)
{
// $artist_model->addTrack();
}
答案 0 :(得分:3)
example.com/music/addArtist
example.com/music/addTrack
您必须严格遵循/ controller / method
的格式当我说方法时,我的意思是字面意思,方法。实际上,在您的基本控制器类中,您应该调用方法的方式是
/**
* Executes the requested action
*/
public function ExecuteMethod($method)
{
$this->{$method}();
}
您可以将addArtist或addTrack传递给该方法。
基本上,/ controller / part只是告诉apache要构造哪个实际的控制器类,而/ method /告诉它该控制器中的哪个方法要执行。
编辑: This是我所知道的最好的MVC教程。我的MVC知识主要基于此。但是,只要不更改MVC的核心值使其变得如此强大,就可以稍微改变标准MVC结构以更好地满足您的需求。
编辑2 :(回复你的编辑) 所以你要问它如何查看表格。
查看表单和提交表单是两个完全不同的操作,应该这样对待。此外,每个控制器动作,必须拥有自己的视图。
一种简单的方法,每当用户需要来自服务器的任何数据(或操作)时,您必须有一个操作和视图。
这意味着,你的控制器中有两个独立的方法,viewForm()和submitForm()。现在,你在控制器类中显示的内容,你有addArtist(),editArtist()等,效率很低,因为你只是将它们别名化为相应的模型函数,这类函数会跳过MVC的整个点。
我无法确切地告诉您如何实施控制器,因为我不确切知道您的目标是什么。但是,我们假设您有一个列出所有艺术家的页面,并且每个动作旁边都有按钮(顺便说一句,正如我在评论中所说,在这样的实现中,如果您正在展示艺术家和不同页面上的曲目,它们应该有单独的控制器)。在此实现中,您将拥有一个控制器 - >查看此设置:
因此向用户呈现艺术家列表。他们有3个选择。
Tracks的结构完全相同。
答案 1 :(得分:1)
我在框架中处理这个问题的方法是尝试支持RESTful接口。我有
example.com/artist
example.com/track
然后我使用HTTP动词来表示意图(POST / PUT / DELETE / GET)
它并不总是很合适,但这是一种做法。
在您的情况下,我会担心在单个文件中放入太多代码。如果您将所有责任放在插入控制器中,那么很快就会变成一个难以处理的代码文件。在你的情况下,我可能会使用两个控制器,然后在每个控制器上创建正确的方法。