Php MVC和ORM-哪个模型逻辑去哪里? 为了清楚起见,考虑一个相当标准的“用户注册”功能:

Php MVC和ORM-哪个模型逻辑去哪里? 为了清楚起见,考虑一个相当标准的“用户注册”功能:,php,model-view-controller,design-patterns,orm,propel,Php,Model View Controller,Design Patterns,Orm,Propel,我的ORM(Prope)允许您修改ormUser类,它扩展了ormUserBase,以便引入自定义功能 现在,我已经将Propel与MVC框架结合起来,我想知道从最佳实践的角度来看,哪些逻辑应该走到哪里 对于我的用户注册功能,我将创建: RegistrationController-使用 UserModel-这反过来应该调用 登录视图 注销视图 注册视图 剖面视图 用户数据库表与用户配置文件相结合,并生成了使用这些表的简便方法。但是现在Propel的标准方法还不够,我需要扩展功能 在哪里可以

我的ORM(Prope)允许您修改ormUser类,它扩展了ormUserBase,以便引入自定义功能

现在,我已经将Propel与MVC框架结合起来,我想知道从最佳实践的角度来看,哪些逻辑应该走到哪里

对于我的用户注册功能,我将创建:

  • RegistrationController-使用

  • UserModel-这反过来应该调用

  • 登录视图
  • 注销视图
  • 注册视图
  • 剖面视图
用户数据库表与用户配置文件相结合,并生成了使用这些表的简便方法。但是现在Propel的标准方法还不够,我需要扩展功能

在哪里可以正确地做到这一点

我是否只会为新的查询方法扩展ormUser,并将非查询逻辑放在我的UserModel中? 或者,您会简单地忽略ormUser并对所有自定义内容使用UserModel,根据我的逻辑需要调用其他ormTableNameClass-s吗

我知道在Propel中保留新方法有利于在其他模型和控制器中重用,但从“正确执行”的角度来看,我不确定,因为我似乎需要业务逻辑来确定某些查询的结果


更新:显示了一个人通常是如何使用Propel的,在我看来,它与框架的模型是重叠的…

我是在将Propel与symfony 1.0配对几年后得出这一结论的。也许我还没有完全理解你的帖子,但我不确定你认为《推进》遗漏了什么

为了清楚起见,你称之为模型的东西,我称之为“业务逻辑”或“操作”。模型,至少是我理解术语的方式,是数据库和数据库顶部的类层。您的“视图”仍然是MVC的逻辑/操作部分的一部分。我认为一个视图正式指的是不同的东西:呈现动作输出的输出层

在spreep中,每个表基本上有三个类:row、peer和query(从历史上看,spreep用户已经习惯了两个类,因为query是新的)。该行很简单-只是数据库行的类表示。对等对象用于表范围的操作,例如选择几行,查询类是一个新的可链接API,用于在数据库上运行语句

因此,在您的每个操作(登录、注销等)中,您都应该调用Propel来完成必要的工作。当您发现您的操作中有大量代码时,在大多数情况下,可以将其重构为一行或对等行。这符合MVC的经验法则“瘦控制器,胖模型”,即尽量使控制器中的db保持苗条

您应该如何构建项目取决于您的框架,但我会这样展示:

    RegistrationController - which uses the

    UserAction - which in turn should call something like

    LoginAction (rendered by LoginView)
    LogoutAction (rendered by LogoutView)
    SignupAction (rendered by SignupView)
    ProfileAction (rendered by ProfileView)

    - each of which access the model UserModel

这取决于要添加的功能类型。你能举个例子吗?当然可以,我想创建一个公共的“按字母顺序显示用户档案”视图。我需要分页逻辑和多个查询,其中大多数都是本机的,但我们假设它们没有被完全覆盖。假设我需要查询本身的逻辑,它与数据库无关。我会在Prope中创建一个方法,该方法接受分页的参数,从我的模型执行该方法并工作,还是在我的模型中完成所有工作?在这种情况下,控制器应该检索按字母顺序排列的用户模型列表,并将该列表传递给视图。视图然后构造用户配置文件的实际列表的HTML输出。我不知道spreep是如何工作的,但是您不应该将检索逻辑添加到用户模型中。理想情况下,您应该创建某种类型的用户存储库类,该类与Prope接口,该类将负责从数据库检索用户对象。谢谢-存在混淆,因为ORM(Prope)提供了对其(生成的)基本CRUD类的扩展。在框架术语中,这些或多或少已经是一个模型了,或者至少是一个完整的getter/setter(验证等)。如果我理解正确,让我的框架UserModel扩展Propel的ormUser可能会更好/更干净-所以我有所有的CRUD,如果需要可以扩展它?是的。如果你看一下symfony jobeet教程,也许会有所帮助。我只是记得不久前我浏览了本教程,但这是一个MVC框架和ORM如何协同工作的好例子。您可以只关注控制器和模型章节。我浏览了本教程的条令版本,但链接到了推进版本。本教程对于当前版本的Prope的更新程度我不知道。您能否详细说明UserAction/OtherActions如何相互关联以及Prope类?我不确定我是否理解,但我相当确定它们不是由推进生成的类,而是构建推进对象并使用它们,将结果返回给控制器?正确,动作和视图元素是框架的一部分,而不是ORM的一部分。一些用例可以由框架生成——我相信这些被称为“框架”(Rails)或“管理生成器”(symfony)。它们通常仅用于特定表上的列表详细视图(例如“订单”)。对于这里的所有用例,我认为您应该手动编写这些文件。(附录:如果你浏览了MVC教程,三部曲各个部分之间的描述会变得更加清晰。Jobeet非常优秀,但只适用于较旧版本的symfony。)因此UserAction充当了控制器和它可以调用的实际操作之间的中间层;它表示注册领域内所有用户相关操作的网关。SomeAction拥有所有业务逻辑,并利用了Prope。推进处理实际生产任务