代码之家  ›  专栏  ›  技术社区  ›  jpeltoniemi

在cakephp中共享应用程序逻辑的正确位置是什么?

  •  6
  • jpeltoniemi  · 技术社区  · 16 年前

    我想这个问题的简单答案是 成分 .

    虽然我同意,但我觉得为如此具体的东西写一个组件很奇怪。

    例如,假设我有一个用户表。当一个用户被创建时,它应该形成一个事件的连锁反应,在数据库中引发与用户相关的不同类型的数据。我认为最好避免直接从不同的控制器上操作数据库,而是将所有这些整齐地打包在一个方法中。但是,由于某些逻辑需要单独访问,所以我真的不能将整个包放在一个方法中。相反,我认为把它分成小块是合乎逻辑的(比如 $userModelOrController->createNew() $candyStorageModelOrController->createNew()) 它们只与各自的数据库表交互。

    现在,如果把逻辑放在模型上,在我需要使用其他模型之前,它会很好地工作。当然,这是可能的,但与在控制器中加载模型相比,并不是那么简单。就像一个蛋糕开发商告诉我“当然,如果你想那样做是有可能的,但我不会那样做”。

    然后,如果将逻辑放入控制器,我就可以很容易地访问其他模型 $this->loadModel() ,但这让我回到之前解释的情况,因为我需要能够无限期地继续连锁反应。从控制器访问其他控制器是可能的,但似乎没有任何直接的方法,所以我猜我仍然没有做对。

    通过使用组件,这个问题可以很容易地解决,因为组件对我想要的每个控制器都是可用的。但就像我在开始时写的那样,创建一个专门用于这一任务的组件感觉很尴尬。对我来说,组件看起来更像是额外功能的包(比如核心组件),而不是共享控制器特定逻辑的东西。

    既然我对mvc还不熟悉,我可能完全误解了这个概念。再一次,如果有人指点我正确的方向,我会很感激:)

    5 回复  |  直到 13 年前
        1
  •  3
  •   Vanja D.    13 年前

    每当我面对如此困难的情况时,我都盯着 CakePHP Events System 持续了无数个小时。

    到目前为止我已经设法 避开它 不知怎的(主要是因为缺乏勇气),但我认为这是值得研究的,因为它显然是为了跳出mvc的“墙”在某种程度上。

    另一个可能的解决方案是 Finite State Machine behavior ,它允许您更清晰地将逻辑推向模型,并围绕模型构建控制器+组件。这种行为唯一的退步(imho)是它不允许多个 state 单个模型上的字段。

    对这样一个问题的更真实的描述可能会产生更好的解决方案,因为我们中的许多人走上了这条道路,这可能是一个有价值的例子。

        2
  •  0
  •   sibidiba    16 年前

    cakephp不支持easly,这是一个无限制的错误。

    • 从模型访问另一个模型
    • 从模型访问组件
    • 从组件访问任何模型
    • 具有可从控制器和视图(组件和辅助程序之间的某种东西)访问的功能,或从辅助程序访问组件(反之亦然)

    最后我主要是向超类appcontroller添加函数。

        3
  •  0
  •   bancer    16 年前

    它在 cookbook : “组件是控制器之间共享的逻辑包。如果您发现自己想在控制器之间复制和粘贴内容,可以考虑在组件中包装一些功能。”

        4
  •  0
  •   codegy    16 年前

    如果希望模型共享一些逻辑,可以使用appmodel。如果需要访问模型中的不同模型,可以使用 App::import() ClassRegistry::init . 现在,如果您希望逻辑仅对您选择的某些模型可用,则可以使用 Behavior 或者创建一个不同的appmodel,其中只有选定的模型将继承。

        5
  •  0
  •   mikegreenberg    16 年前

    也许更好的实现方法是在插件中。插件允许您将MVC所有部分的全部功能封装到一个包中,该包可以通过插件的帮助程序、组件和行为在代码中的任何位置被拉入。这种方式,

    • 你可以把功能放在最合适的地方,
    • 逻辑与应用程序的其他逻辑保持分离,并且
    • 您可以根据需要启用/禁用此功能。