具有RESTful API,多个模型和共享视图的MVC控制器

Ale*_*ler 5 php rest model-view-controller design-patterns laravel

前言:下面的文字大小合适,因为我试图通过类似的,基本的和概念性的问题来最大化其他读者的价值.


介绍

目前我正在开发一个基于Web的事件管理工具,它使用Laravel MVC框架来维护适当的应用程序结构并简化开发.

应用程序的目标是

  • 提供创建(分别为CRUD)事件的有效方法
  • 邀请注册用户参加这些活动
  • 允许用户确认他们参与之前创建的活动

继MVC模式之后,我创建了

  • 一个名为的模型 Event
  • 一个 EventController
  • 多个视图
    • 静态event视图,显示已存在的事件
    • 用于创建和编辑命名的表单视图 eventForm
    • eventIndex,所有活动的清单

到目前为止,一切似乎都相对简单,但当我尝试实现更多功能以允许用户确认他们参与特定事件时,我遇到了设计问题.

更多详情

为了进一步说明,每个Event都有许多属性(一些省略):

  • 标题
  • 描述
  • 多个EventDates,由以下属性组成:
    • 标题
    • A时间跨度(例如09-20-2013 09:00 AM至09-20-2013 05:00 PM)

前面提到EventDate的也是具有相关数据库表的模型.

通过用户登录的帐户进行区分,我$admin为所有视图和控制器创建了一个布尔变量,用于以event下列方式更改视图:

  • $ admin = true:视图是一个静态页面,显示表中的Events属性和EventDates
  • $管理员= FALSE:此外,该视图有一个隐藏的表单和每个按钮EventDate表行,允许用户确认或拒绝他们的参与对每个的EventDate小号

使用变量和@if...@endif-blocks来改变视图对我来说似乎是可以接受的,因为尽管存在隐藏形式,但用户模式管理模式之间的差异非常小.

问题

现在,我遇到的问题如下:

谁负责处理用户模式隐藏表单的POSTed数据?

首先,这里有一些关于当前发展状态的事实:

  • Event控制器目前提供以下功能:

    /* CRUD functions */
    public function CreateEvent()
    public function ShowEvent($id)
    public function UpdateEvent($id)
    public function DeleteEvent($id)
    /* Form display helpers */
    public function NewEvent()
    public function EditEvent()
    
    Run Code Online (Sandbox Code Playgroud)
  • EventDate模型是从单独的Event模型,作为Event具有多个EventDate小号
  • 每个用户以及EventDate绑定到EventDateConfirmation模型的另一个单独表中存储确认

解决方法

这些是我所知道的选择:

  1. EventController,必须以类似的方法来延长CreateEventDateConfirmation()等,导致多CRUD方法,甚至不属于这个控制器,因为它们没有直接视为该Event模型,并在没有变化的情况events

  2. 在一个单独的EventDateConfirmationController,只负责获取和设置EventDateConfirmation模型数据,有两种使用可能性:

    • 通过使用有点笨重来调用EventDateConfirmationControler方法EventController

      Controller::resolve(DEFAULT_BUNDLE,'EventDateConfirmationController')->CreateConfirmation($params);
      
      Run Code Online (Sandbox Code Playgroud)
    • 将直接响应隐藏表单POST请求的路由设置为相应的EventDateConfirmationController操作

    第一种可能性的缺点是以令人不愉快的方式调用外部控制器这对我来说是错误的,当表单还包含直接属于事件的数据时,第二种可能性是不可行的,因此必须由Event控制器处理

  3. ??

在我看来,#1和#2都不是解决问题的好方法,因为它们似乎是黑客攻击,并且在MVC模式中不太适合.

有哪些替代方案可以解决这个问题?

先感谢您!

Lan*_*och 0

我认为你也许可以做#2,让它不那么老套,但仍然不需要比以前做太多改变。否则我认为#1不是一个好的选择。

实际上,如果我处于您的情况下,我会做的是创建 EventDateConfirmationController 并在用户模式视图中,将其设为异步 ajax 的单独形式。当用户单击[假设]他/她要去的复选框时提交表单,或者当他们提交其他表单时提交表单。

我绝对觉得 javascript 可以帮助你保持代码的一致性并且仍然像 MVC 一样。