我刚刚遇到了我目前用于应用程序的 MVC 架构的限制之一。目前,我的网址如下所示:
www.example.com/controller/action
每个请求都到达前端控制器,前端控制器从 URL 加载请求的控制器类,并执行其操作(方法)。这工作正常,直到您需要开始使用嵌套控制器。
例:有一个"用户"控制器,其中包含创建用户(),editUser(),deleteUser()等方法。使用当前的 URL 结构完全可以实现...但是,如果我们还需要管理用户类型怎么办?我们需要一个单独的控制器"usertypes",它还包含创建UserType(),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%的折扣等......但他们想随心所欲地添加更多。
这意味着我需要一个 PromotionType 控制器,它还包含 add()、getAll()、getSingle()、delete()...如果促销类型控制器可以嵌套在原始促销控制器中,那就太好了,这样可以启用 URL,如下所示:
example.com/promotions/promotiontypes/add
而不是
example.com/promotiontypes/add
使用我当前的前置加载器,这是不可能的,因为 URL 的第一部分会自动被视为控制器,第二部分被视为从中执行的操作。
似乎您没有将控制器绑定到视图,而是绑定到每个域对象。
另外,奇怪的路由是怎么回事?为什么不呢:
POST "www.example.com/profile/42/type"
因为您要将类型添加到特定用户的配置文件中。这转换为在Profile
控制器上执行方法 postType()
。
如果您正在构建自己的路由机制,也许这个答案可能会有所帮助。
底线是:你不需要这种奇怪的控制器中的控制器。您需要的是开始查看您拥有的视图类型,然后为每个视图创建控制器,而不是从查看模型层开始。
你没有提到你是否正在使用框架,但正常的方式是让"路由器"对异常应用特殊处理,例如Zend Framework路由器