CakePHP中文手册【翻译】-插件

 插件

CakePHP允许你建立一个Controllermodel以及view的组合,并且可以将他们发布为一个已打包的应用程序插件,以至在CakePHP应用程序中,其他可以使用它。在你的一个应用程序中,有一个优秀的用户管理模块,简单的blogweb 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, 在插件后命名 

不需要为任何普通的应用程序都定义一个AppControllerAppModel为插件定义他们吧。在插件工作之前你需要创建他们。这2个特殊的类是在插件之后命名的,并且他们扩展了父应用程序的AppControllerAppModel。他们可以像下面一样:

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

使用插件

因此,既然我们已经做了所有事情,我们应该开始准备发布它了(尽管我们曾经建议你已经发布一些额外的,例如readmesql文件等)。

一旦一个插件在/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’的插件和一个名为UsersControllercontroller可以通过/users/add访问。

3.    缺省的,插件会使用/app/views/layouts 文件夹里的布局。

4.    在你的controller里,你可以使用下面的来实现一个内部插件通讯:

$this->requestAction('/plugin/controller/action');

5.    如果你使用requestAction,确保controllermodel尽可能唯一。否则你可能会有一个"redefined class ..."(类重定义)错误

非常感谢 Felix Geisendorfer为本章提供最初的资料。

Last Updated:2006年12月3日
posted @ 2006-11-25 15:28  张太国  阅读(...)  评论(...编辑  收藏