2012-08-14 74 views
0

我刚刚遇到了我目前用于我的应用程序的MVC架构的局限之一。目前,我的网址是这样的: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结构,其中有网址,如:

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

最近,他们问我,使它能够同时管理类型的促销活动,邮件和持卡人。现在他们已经有学校折扣,20%的折扣等等,但他们想要增加更多,因为他们希望。

这意味着我需要一个PromotionTypes控制器,该控制器还包含add(),getAll(),getSingle(),delete()等操作...如果PromotionTypes控制器可以嵌套在原始促销中控制器,这使得网址像这样:

example.com/promotions/promotiontypes/add 

,而不是

从我目前的前端装载机,这是不可能的,因为URL的第一部分将自动被作为控制器处理,第二部分作为从中执行的动作。

+0

你有控制器和模型混淆。你所有的方法都应该存在于你可以随时访问的模型中。控制器应该像处理过的那样处理特定情况,但要足够灵活,可以使用任何你需要的模型。您是否使用自动加载器加载您的课程/模型? – 2012-08-14 23:49:56

+0

如果您将控制器和路由的概念分开,并且有一个可配置的路由器来确定给定url的正确控制器和操作,则不需要嵌套控制器。这是主要框架的作用。 – wgcrouch 2012-08-14 23:51:27

回答

1

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

1

看起来好像你已经将控制器绑定到视图上,而不是每个domain object

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

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

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

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

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

+0

我已经用我当前的URL结构和前端加载器的表示更新了我的原始问题。你可以看看吗?我似乎无法理解将控制器绑定到视图的好处......感谢 – user1440560 2012-08-15 12:12:19

+0

@ user1440560控制器与视图相关联,以避免这种误导性的控制器控制器控制器的可憎行为。另外,这是因为视图和控制器属于同一图层,而模型实际上是完全独立的图层。然后再次,我确信你并没有真正的看法。只是一个你为了外观而称之为“视图”的模板。 – 2012-08-15 13:13:22