插件
CakePHP允许你建立一个Controller,model以及view的组合,并且可以将他们发布为一个已打包的应用程序插件,以至在CakePHP应用程序中,其他可以使用它。在你的一个应用程序中,有一个优秀的用户管理模块,简单的blog或web service模块吗?将它打包为一个CakePHP插件,这样你可以将它使用到其他应用程序中。
一个插件和插件安装的应用程序的主要连接点是应用程序的配置(例如数据库链接等)。否则,它会在自己狭小的空间里进行操作,如果它是它自己拥有的应用程序,其行为非常类似它自己的行为。
第1节
创建一个插件
作为一个正在工作的实例,让我们创建一个插件来为你预订匹萨吧。非常英明的选择哟,,让我使用’pizza’吧。
在任何一个CakePHP中,什么东西会更加有用呢?为了开始进行,我们需要将插件文件放在/app/plugins 文件夹下。所有插件文件的父文件夹名是很重要的,并且会在多个地方使用,最终,可以如下创建:
Pizza预订文件系统布局
/app /plugins /pizza /controllers <- plugin controller /models <- plugin model /views <- plugin view /pizza_app_controller.php <- plugin AppController,在插件后命名 /pizza_app_model.php <- plugin AppModel, 在插件后命名 |
不需要为任何普通的应用程序都定义一个AppController和AppModel,为插件定义他们吧。在插件工作之前你需要创建他们。这2个特殊的类是在插件之后命名的,并且他们扩展了父应用程序的AppController和AppModel。他们可以像下面一样:
Pizza Plugin AppController: /app/plugins/pizza_app_controller.php
<?php
class PizzaAppController extends AppController { //... }
?> |
Pizza Plugin AppModel: /app/plugins/pizza_app_model.php
<?php
class PizzaAppModel extends AppModel { //... }
?> |
如果你忘了定义这些特殊的类,CakePHP会给你一个“Missing Controller”的错误,通知你改正这个问题。
第2节
插件Controller
我们匹萨插件的Controller保存在/app/plugins/pizza/controllers厘面。因为我们关心的主要事情是匹萨订单,所以我们需要为插件准备一个OrdersController。
它是不需要的,建议你把你的插件controller命名为一个相对唯一的,这是为了避免与其父应用程序域名相冲突。一个父应用程序可能会有一个UsersController, OrderController, 或 ProductController,这并没有想得太远:因此你可能想有一个创意的controller名,或者将插件名添加到类名中(本例中是PizzaOrdersController)。
因此,我们可以将PizzaOrdersController放在/app/plugins/pizza/controllers 里,如下:
/app/plugins/pizza/controllers/pizza_orders_controller.php
<?php
class PizzaOrdersController extends PizzaAppController { var $name = 'PizzaOrders';
function index() { //... }
function placeOrder() { //... } }
?> |
注意这个controller是如何扩展插件的AppController(称为PizzaAppController),而不是父应用程序的AppController。
第3节
插件Model
插件Model放在/app/plugins/pizza/models. 我们已经为插件定义了一个PizzaOrdersController。因此让我们为controller创建一个model,称为PizzaOrders(类名PizzaOrders与我们的命名规则相符,并且足够唯一,因此我们留着它吧)。
/app/plugins/pizza/models/pizza_order.php
<?php
class PizzaOrder extends PizzaAppModel { var $name = 'PizzaOrder'; }
?> |
请注意,本类扩展了PizzaAppModel,而不是AppModel。
第4节
插件View
View的行为和它在普通的应用程序里非常相似。将他们放在正确的文件下,在/app/plugins/[plugin]/views文件下。对于我们的匹萨预订插件,我们至少需要为我们的PizzaOrdersController::index()动作准备一个试图,因此也让我们包含它吧:
/app/plugins/pizza/views/pizza_orders/index.thtml
<h1>Order A Pizza</h1> <p>Nothing goes better with Cake than a good pizza!</p> <!-- An order form of some sort might go here....--> |
第5节
使用插件
因此,既然我们已经做了所有事情,我们应该开始准备发布它了(尽管我们曾经建议你已经发布一些额外的,例如readme,sql文件等)。
一旦一个插件在/app/plugins安装,你可以通过/pluginname/controllername/action URL来访问它。在匹萨预订插件的例子里,我们可以通过/pizza/pizzaOrders访问PizzaOrdersController。
在CakePHP里,使用插件的一些最终技巧有:
1. 当你没有一个[Plugin]AppController and [Plugin]AppModel,当你试图访问一个插件controller时,你会收到一个丢失Controller的错误。
2. 你可以让一个缺省的controller带有一个你的插件的名称。如果你这样做了,你可以通过/[plugin]/action访问它。例如,如果在你的[plugin]/controllers文件夹里没有一个AddController的插件,名为‘users’的插件和一个名为UsersController的controller可以通过/users/add访问。
3. 缺省的,插件会使用/app/views/layouts 文件夹里的布局。
4. 在你的controller里,你可以使用下面的来实现一个内部插件通讯:
$this->requestAction('/plugin/controller/action');
5. 如果你使用requestAction,确保controller和model尽可能唯一。否则你可能会有一个"redefined class ..."(类重定义…)错误
非常感谢 Felix Geisendorfer为本章提供最初的资料。
Last Updated:2006年12月3日