| 状态 | 草稿 |
|---|---|
| Todo | Using Controller namespace, replacing/extending system libraries, which libs can be extended? |
| 官方最后更新时间 | 2009/02/04 08:21 |
Kohana 总是自动加载下列库:
当使用其他库时也是可以自动加载的。比如,加载并使用 Profiler 库,你只需要添加下面的代码到你的控制器的构造函数当中:
$this->profiler = new Profiler;
详情请参见 加载资源(Loading) 页面。
如果你想创建自己的库,需遵守下列约定:
application/libraries (或如果创建了模型则放在 modules/libraries目录下面)_Core” 后缀)_Core” 后缀,使你能用扩展 Kohana 内置类库的方式来扩展你的类库。例如,你想创建一个 “book” 的类库:
文件: application/libraries/Book.php
<?php defined('SYSPATH') or die('No direct script access.'); class Book_Core { // 这里添加 constructor/methods/properties } ?>
Kohana 允许扩展其内置库,即可以加上你自己的方法功能或者改变它们的功能。你可以创建一个新的库来集成内置库,但决不能删除掉 system/libraries 目录下的文件,你可以创建一个新的类库来继承内置类库。
通过在你的库名结尾加上 ”_Core” 后缀,你也能扩展你的类。
扩展库除需要遵循创建类库的约定外,还要遵循以下规定:
MY_” 前缀。这个前缀是可更修改的,详情请参见 配置(Configuration)。_Core” 后缀。下面,举一个例子,让你知道是如何扩展 Kohana 的控制器类的:
文件: application/libraries/MY_Controller.php
<?php defined('SYSPATH') or die('No direct script access.'); class Controller extends Controller_Core { public function __construct() { // 不要忘记调用父类构造器! parent::__construct(); } } ?>
希望扩展核心类不仅仅使用在 Kohana 当中。如果你想执行行为(implement behaviour)那么就应该应用到一个 Kohana 类,如 全站(site-wide behaviour),下面有很好的方法来实现。
下面有一些例子说明为什么你要继承 Kohana 控制器类的特别性:
你或许还想自动加载模型和库,这可以通过继承核心控制来实现并从构造器中加载任何的库和模型。
替换替换 Kohana 系统自建库也是可以实现的(虽然不太可能经常用到)。约定在添加自己的库之外还有几个约定:
_Core” - 这个是必须的!举个例子,你想替换 分析库(Profiler Library),则需要按照下面的代码:
文件: application/libraries/Profiler.php
<?php defined('SYSPATH') or die('No direct script access.'); class Profiler_Core { // 在这里定义自己的 profiler } ?>
如果你需要第三方库的支持(比如 Simplepie,Zend Framework 或 Pear 库),你可以把它们放在 application/vendor 文件夹下面。从 Kohana 加载也比较简单:
include Kohana::find_file('vendor','some_class');
更多信息可以参阅 Kohana 类 页面。 以及 Kohana 中文爱好者论坛发布的样例
注意有些第三方库可以需要修改以适应 Kohana 库。所以有时重命名或类名是有必要的。
Zend Framework中的文件是相互依赖,可能会因为没有正确的配置而导致不正确的加载。如果 ZendFramework 目录放置在 applications/vendor/zend 下面,请按照下面的代码操作:
// 在加载 Zend Framework 组件前确认放置的位置 ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.APPPATH.'vendor/zend/library/');
想要加载一个 Zend Framework 组件的相关代码:
// 例子 require_once 'Zend/Service/Flickr.php'; // 或者 require_once 'Zend/Acl.php'; $acl = new Zend_Acl();
注意,它也可以放在 SYSPATH 目录下面但是它会被新版本覆盖。扩展目录是一个很好的选择:
ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.SYSPATH.'vendor/zend/library/');