组织CakePHP代码

时间:2012-12-10 18:40:48

标签: php cakephp refactoring

我在理解组件,实用程序和行为之间的区别时遇到了问题。 我读了Cookbook,但它只帮助了我一部分。

例如 - 我想在上传时调整图片大小。 我将使用与不同模型和控制器/操作相关的许多不同形式。

显然,我需要编写一个具有 scale 调整大小 saveImage 和其他有用方法的类。 我还需要能够在不同的地方使用这种方法。

我的问题是 - 放置此代码的正确位置在哪里?有人能为我提供一些关于组件,实用程序和行为之间核心差异的简单示例吗?因为对我来说,组件和实用程序看起来非常相似。

2 个答案:

答案 0 :(得分:2)

  • 行为是适用于模型的逻辑包。
  • 组件是适用于控制器的逻辑包。
  • 实用程序是通用库,不一定适用于MVC的任何特定部分。

实用程序和行为/组件之间的主要区别在于实用程序类不扩展核心MVC类,因此不会自动接收其父类的请求周期中的挂钩。例如,在Component中,您可以实现一个beforeRender()函数,该函数会在控制器每次调用该控制器时自动呈现其布局/视图之前调用。

此外,必须实例化实用程序类并在使用前将其分配给变量:$myUtil = new MyUtility(); $myUtil->blah() - 行为/组件/帮助程序在加载到类中时实例化,并且可以使用$this->MyComponent->blah()引用

在您的情况下,图像处理逻辑很可能属于Component或Utility类,您可以选择以任一方式实现它。就个人而言,我会编写一个Component,因为你不太可能在控制器之外使用图像处理逻辑。

修改:您可能还会考虑查找和使用某人已撰写的现有组件,例如我找到了ImageToolImage ResizerImage Upload & Resizer,在Google搜索的大约2分钟内发现Thumbnail

答案 1 :(得分:0)

行为是您放置应在多个模型中重用的代码的地方 组件是放置将在多个控制器上使用的代码的位置 和助手是您放置将在多个视图中使用的代码的地方

这是基本故障。

由于控制器负责应用程序逻辑,因此将上传器/缩放器构建到组件中似乎最有意义。

如果您需要修改数据的访问方式或从数据库返回数据,那将是一种行为(因为它会影响模型层)

如果您需要创建一些可重用的代码来生成HTML或某种类型的视图输出,那将是一个帮手。

上传,缩放和调整图片大小的示例。我会把它变成一个组件。例如,我有一个名为UploadComponent.php的组件,用于上传,保存和创建缩略图。

我通过执行以下操作将此组件添加到控制器:

 var components = array('Upload');

然后我可以通过执行以下操作在我的控制器中使用它:

$this->Upload->createThumbnail(200, 200);

显然,您实施组件的详细信息取决于您。

希望有所帮助。

相关问题