用于MVC架构的多级控制器

时间:2012-08-14 23:45:31

标签: php model-view-controller controller front-controller

我刚刚遇到了我目前正在为我的应用程序使用的MVC架构的一个限制。目前,我的网址如下所示:

www.example.com/controller/action

每个请求到达前端控制器,前端控制器从URL加载请求的控制器类,并执行它的操作(方法)。这很好,直到你需要开始使用嵌套控制器。

实施例: 有一个'用户'控制器,它拥有createUser(),editUser(),deleteUser()等方法。所有这些都完全可以使用当前的URL结构......但是,如果我们还需要管理用户类型呢?我们需要一个单独的控制器'usertypes',它也包含createUserType(),editUserType()等方法......但是,由于用户类型是用户的一部分,'usertypes'控制器应嵌套在用户控制器内,因为:

www.example.com/users/usertypes/addusertype

然而,使用当前的URL结构,这是不可能的......如何使用嵌套(或多级,如果你愿意)控制器?

更新:这是我正在处理的应用程序的基本表示:它是管理部门的基本业务应用程序,可以添加,查看,编辑和删除3个类别(促销,邮件和持卡人)中的数据。每个类别代表数据库中的一个表,并具有自己的不同字段。帐户需要由管理员创建,用户无法自行创建帐户,也无法查阅其用户个人资料。

对于这些类别中的每一个,我都创建了一个控制器,它包含add(),edit(),getAll(),getSingle(),delete()等动作......每个动作都调用适当的方法模型并呈现相应的视图。

当前的URL结构可以实现这一点,其URL类似于:

example.com/promotions/add
example.com/promotions/getsingle?id=123

最近他们让我能够管理各种促销,邮件和持卡人。现在他们已经有了学校折扣,20%的折扣等......但是他们想要按照自己的意愿添加更多。

这意味着我需要一个PromotionTypes控制器,它还包含add(),getAll(),getSingle(),delete()等操作......如果PromotionTypes控制器可以嵌套在原始促销控制器中,那将会很好,这样可以启用URL:

example.com/promotions/promotiontypes/add

而不是

example.com/promotiontypes/add

使用我当前的前端加载器,这是不可能的,因为URL的第一部分自动被视为控制器,第二部分被视为要从中执行的操作。

2 个答案:

答案 0 :(得分:2)

您似乎已将控制器与视图绑定,而不是绑定到每个domain object

另外,奇怪的路由是什么?为什么不:

POST "www.example.com/profile/42/type"

因为您要向特定用户的配置文件添加类型。这转换为在postType()控制器上执行方法Profile

如果您正在构建自己的路由机制,那么this answer可能会有所帮助。

底线是:你不需要这种奇怪的控制器控制器。您需要的是开始查看您拥有的视图类型,然后为每个视图创建控制器,而不是从查看模型层开始。

答案 1 :(得分:1)

您没有提到您是否使用框架,但通常的方法是让“路由器”对异常应用特殊处理,例如: Zend Framework routers