简单的PHP MVC框架设计

时间:2014-08-05 16:56:36

标签: php url-routing

所以,几周以来,我一直在玩我自己的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();
}

2 个答案:

答案 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的整个点。

我无法确切地告诉您如何实施控制器,因为我不确切知道您的目标是什么。但是,我们假设您有一个列出所有艺术家的页面,并且每个动作旁边都有按钮(顺便说一句,正如我在评论中所说,在这样的实现中,如果您正在展示艺术家和不同页面上的曲目,它们应该有单独的控制器)。在此实现中,您将拥有一个控制器 - >查看此设置:

  • /艺术家/观点 - >返回带按钮
  • 的html艺术家列表
  • / Artists / viewAddForm - >返回一个用于创建新艺术家的空白表单
  • / Artists / submitAdd - >返回一个html确认页面
  • / Artists / viewEditForm - >返回一个表单以便使用预填充值进行编辑
  • / Artists / submitAdd - >返回一个html确认页面
  • /艺术家/删除 - >返回一个html确认页面

因此向用户呈现艺术家列表。他们有3个选择。

  1. 他们点击添加,填写表格,提交表格,然后转到确认页面。
  2. 他们点击编辑,编辑表单,提交表格,然后转到确认页面。
  3. 他们点击删除,直接进入确认页面,因为没有数据要填写。
  4. Tracks的结构完全相同。

答案 1 :(得分:1)

我在框架中处理这个问题的方法是尝试支持RESTful接口。我有

example.com/artist
example.com/track

然后我使用HTTP动词来表示意图(POST / PUT / DELETE / GET)

它并不总是很合适,但这是一种做法。

在您的情况下,我会担心在单个文件中放入太多代码。如果您将所有责任放在插入控制器中,那么很快就会变成一个难以处理的代码文件。在你的情况下,我可能会使用两个控制器,然后在每个控制器上创建正确的方法。