白色标签CakePHP:What';为实现者提供定制挂钩/回调的最佳方式是什么?

白色标签CakePHP:What';为实现者提供定制挂钩/回调的最佳方式是什么?,cakephp,callback,hook,customization,white-labelling,Cakephp,Callback,Hook,Customization,White Labelling,我正在开发一个CakePHP应用程序,我们将为人们提供一个白标签,让他们为自己的公司实现,他们需要为自己提供某些定制功能 首先,他们可以用视图做任何他们想做的事情,如果他们需要添加全新的东西,他们可以添加自己的控制器/模型。不过,我还是建议不要触摸我的控制器和型号,这样版本升级就更容易了 本质上,我计划给他们的定制功能是非常基本的,我只需要在某些事情发生时调用“某物”,这样他们就可以做一些事情,比如更新外部系统,给自己/客户发送电子邮件,诸如此类的事情 我想知道最好的方法是什么 我的计划是为我的

我正在开发一个CakePHP应用程序,我们将为人们提供一个白标签,让他们为自己的公司实现,他们需要为自己提供某些定制功能

首先,他们可以用视图做任何他们想做的事情,如果他们需要添加全新的东西,他们可以添加自己的控制器/模型。不过,我还是建议不要触摸我的控制器和型号,这样版本升级就更容易了

本质上,我计划给他们的定制功能是非常基本的,我只需要在某些事情发生时调用“某物”,这样他们就可以做一些事情,比如更新外部系统,给自己/客户发送电子邮件,诸如此类的事情

我想知道最好的方法是什么

我的计划是为我的每个控制器建立一个“文件”(一个类),以保持事情的合理组织。这个文件将有一堆我的代码将调用的空方法,它们将能够在这些方法中添加代码来执行它们需要执行的任何操作

具体的问题是,这个满是空方法的类是否应该是一个组件?控制器?只是一个普通的PHP类

我需要从我的控制器调用这个类中的方法,所以我猜不可能把它变成控制器(除非它可能是从我的控制器继承的?或者我的从他们的控制器继承的)。 此外,我需要这些方法的实现者访问我的模型和组件,尽管我可以让它们使用App::Import,但我不需要设置magic$this->ModelName成员

此外,我创建的此文件(etiher组件或控制器)是否必须位于其他(我的)控制器/组件旁边的应用程序文件夹中?或者我可以把它扔到单独的地方,比如供应商文件夹

你以前做过类似的事情吗?
任何需要避免的提示/建议/陷阱都将受到欢迎

我知道这有点主观,如果你以前做过的话,我希望从你的经验中听到更多


谢谢

脑海中浮现出两个想法:

  • 创建客户机可以扩展的模板(控制器、模型,任何必要的)
  • 将控制器/组件/模型编写为它们自己的命名空间中的

最终,您似乎希望提供一个“增强的”蛋糕框架,您的客户仍然需要在其中编写自己的蛋糕代码(我不知道这与您的“基本定制功能”的想法是如何结合的)。因此,您应该以尽可能多的“可选”方式编写代码(名称空间的插件、组件、
AppModel
enhancements、额外的libs)并提供有关如何使用这些来帮助客户加快工作速度的文档。

我将设置一组常见的事件,并使用类似“链接到事件”的系统来处理此问题

这使客户端能够管理事件处理程序类(阅读自述文件以了解我的意思),并在应用程序范围内订阅和广播事件

另外,如果你想让你的用户不去玩弄你的核心功能,我建议你把你的主应用打包成一个插件


非常感谢您的回答。抽象控制器的想法听起来很有趣,我需要进一步研究,以确保CakePHP不会被它扼杀。至于你提到的另一点,我绝对不会扩展CakePHP,然后让我的客户编写他们自己的代码。我将为他们提供一个开箱即用的全功能应用程序,但我知道他们中的一些人会在某些事情发生时想做一些事情。例如,当创建/修改帐户时更新外部CRM,当某些事情发生时给人们发电子邮件,诸如此类的事情。这并不是对系统工作方式的重大修改,只是一些钩子,这样他们就可以做他们可能需要的简单的定制工作。@Daniel你只是让它听起来像你会…:)<代码>抽象类在Cake中工作得非常好(都是PHP),有时我自己也会使用它们。您也可以只提供空类,其中包含在某些事件上调用的方法,如果需要,您的客户机可以使用代码填充这些方法。这真的取决于环境,最好的方法是什么。空类和方法:这正是我的想法,我要问的是“那些类”应该是什么(组件、控制器等),这样,在这些方法中,他们可以使用我的模型/组件等。看起来,我将有一个带有实际代码的“AccountsControllerBase”和“AccountsController”“将具有空方法。这就是你的建议,对吗?@Daniel嗯,这取决于你想坚持蛋糕结构的程度以及你的客户对此的感受。记住,这都是PHP,您不必使用控制器或模型。您可以在
/lib
目录中创建一个新类
EventHooks
,并在其中调用方法,将相关模型或组件作为函数参数传递。该事件系统听起来非常有趣!我将更深入地研究它,它对我的代码的破坏性似乎比抽象类的想法要小,如果它给了我所需要的所有灵活性,我将不得不进行实验。至于打包,我将用ionCube或类似的东西对我的大部分代码进行编码。我知道这并不完美,但它让我很清楚地划定了界限。如果它被编码了,你就不能碰它。非常感谢。