Plugins 插件
CakePHP允许你将一系列的controller,model和view打包成一个package(包)并发布成一个打包好的程序plugin,使得其他CakePHP应用程序可以直接使用它们。在你的某些应用程序里有一个漂亮的用户管理模块,或者一个简单的bog,或者web
service(web服务)模块?把它们打包成CakePHP插件吧,这样你就可以方便地把它们使用到其他程序之中。
一个plugin和安装了这个plugin的应用程序之间最主要的联系是程序的配置(数据库连接等等)。否则,它只能在自己有限的空间里执行操作,看起来就好像是一个单独的应用程序一样了(而和安装plugin的应用程序没有关联了)。
Section 1 创建一个plugin
让我们重新创建一个披萨订购的plugin来作为示例。对于任何CakePHP程序来说,什么才是更有用的呢?做为第一步,我们需要把所有的plugin放在/app/plugins目录里。所有plugin文件的父目录的目录名是非常重要的,并且在许多地方都会使用到它,所以谨慎地挑选一个名字吧。就这个plugin来说,我们使用的名字为’pizze’。文件目录结构的设置最终会是如下所示:
Pizza Ordering Filesystem Layout 披萨订购插件的文件系统布局: /app /plugins /pizza /controllers虽然对于普通程序来说,定义AppController和AppModel并不是必要的,但对于plugin来说却是非常重要的。要是你的plugin能工作,你必须事先创建它们(AppController和AppModel)。这两个特别的类按照plugin的名字来命名,并且继承上层application的AppController和AppModel。它们看起来就像这样:
Pizza Plugin AppController:/app/plugins/pizza_app_controller.phpPizza Plugin AppModel: /app/plugins/pizza_app_model.php如果你忘记定义这些类,CakePHP会传给你“Missing Controller”的错误信息直到你纠正了这个错误。
Section 2 Plugin的controller (插件的控制器)
我们的Pizza Plugin的controller储存在/app/plugin/pizza/controllers。由于我们需要处理的最主要的对象是披萨的订单,我们需要为plugin建立一个OrdersController。 尽管不是绝对必要,但强烈建议为你的plugin controller选取相对唯一的名字来避免与上层应用程序的命名空间(namespace)发生冲突。不难想象,也许我们的上层应用程序会有UsersController,OrdersController或ProductsController:所以你也许需要为controller想一些建设性的名字,或者将controller的类名以plugin的名字开头(在这个例子里,PizzaOrdersController)。 因此,我们把这个新的类PizzaOrdersController放在/app/plugins/pizza/controllers目录下,并且它的内容会像这样:
/app/plugins/pizza/controllers/pizza_orders_controller.php请注意,这个controller继承了plugin的AppController(名字叫PizzaAppController)而不是上层应用程序的AppController。
Section 3 Plugin的model
Plugin的model都存放在/app/plugins/pizza/models。我们已经为这个plugin定义了PizzaOrdersController,解西来,让我们来为这个controller创建model,叫做PizzaOrders(PizzaOrders这个类名符合我们的命名规则,并且已经具有足够的唯一性了,所以我们就用这个名字)。
/app/plugins/pizza/models/pizza_order.php再次强调,注意这个类继承的是PizzaAppModel而不是AppModel。
Section 4 Plugin的view
对于插件来说,view的用法和普通程序完全一样。只是把它们放在指定的目录下:/app/plugins/[plugin]/views(对披萨示例来说,/app/plugins/pizza/views)。对于我们的披萨订购插件,我们至少为我们的PizzaOrdersController::index() action创建一个view,所以我们把以下代码也包含进来:
/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....-->Section 5 使用plugin
好,现在我们已经建立好所有东西,是时候发布我们的plugin了(尽管,我们建议你一同发布一些额外的东西,比如readme,sql脚本文件,等等)。
一但plugin安装在了/app/plugins,你就可以用/pluginname/controllername/action这样的URL来访问它了。在我们的披萨订购插件示例中,我们应该通过/pizza/pizzaOrders来访问PizzaOrdersController。
最后,一些在CakePHP应用程序里使用plugin的小技巧:
- 如果你没有[Plugin]AppController和[Plugin]AppModel,当你试图访问plugin的controller时会收到找不到controller的错误信息。
- 你可以创建一个以你的plugin命名的默认controller。如果你创建了它,你可以通过/[plugin]/action来访问它。例如,一个叫’users’的插件有一个controller名为UsersController,那么可以用/users/add来访问这个controller,只要这个plugin的[plugin]/controllers目录里并没有一个真正叫AddController的类。
- Plugin使用/app/views/layouts目录下的layout(布局)文件来做为其默认的layout。
- 你也可以在你的controller里用 $this->requestAction('/plugin/controller/action'); 来访问内部plugin。
- o 如果你希望使用requestActoin方法,确保所有的controller和model的名字都尽可能地唯一。否则,你也许会收到”redefined class … (类重定义)”的PHP错误信息3002。
感谢Felix Geisendorfer (the_undefined)为本章提供的材料。