前言
加载器,顾名思义,是用于加载元素的,加载的元素可以是库(类),视图文件,驱动器,辅助函数,模型或其他你自己的文件,该类由系统自动加载,无需手工加载。
CI加载器还支持包(Package)概念,应用程序包(Package)可以很便捷的将你的应用部署在一个独立的目录中,以实现自己整套的类库,模型,辅助函数,配置,文件和语言包。建议将这些应用程序包放置在application/third_party目录下,比如下面是一个名为“Foo Bar”的应用程序包目录的例子。
1 | /application/third_party/foo_bar |
我们先来看下CI框架中加载器类的实现框架:
1 | //Nesting level of the output buffering mechanism |
构造函数 construct()
设置组件加载路径,获取初始输出缓冲级别。
1 | public function __construct(){ |
_ci_autoloader()
处理加载config/autoload.php中列出的组件,他们的类别有:包,类库,辅助文件,语言包,用户自定义配置文件,模型等。
1 | protected function _ci_autoloader(){ |
检测类是否加载 is_loaded($class)
为了检测一个类是否已被加载到self::$_ci_classes
数组,主要用于表单辅助函数_get_validation_object()
;
1 | public function is_loaded($class){ |
包路径函数簇:add_package_path($path, $view_cascade = TRUE),get_package_paths($include_base = FALSE),remove_package_path($path = ‘’)
无论应用程序包是为了实现什么样的目的,它都包含了属于自己的配置文件、 辅助函数、语言包、类库和模型。如果要在你的控制器里使用这些资源, 你首先需要告知加载器(Loader)从应用程序包加载资源,使用 add_package_path() 方法来添加包的路径。
add_package_path($path, $view_cascade = TRUE)
添加一个包路径,用于告诉加载器类使用给定的路径来加载后续请求的资源。
1 | public function add_package_path($path, $view_cascade = TRUE){ |
get_package_paths($include_base = FALSE)
返回当前所有可用的包路径。
1 | /** |
remove_package_path($path = ‘’)
当你的控制器完成从应用程序包中读取资源,如果你还需要读取其他的应用程序包的资源, 你会希望删除当前使用的包路径来让加载器不再使用这个文件夹中的资源。 要删除最后一次使用的包路径,你可以直接不带参数的调用该方法。
或者你也可以删除一个特定的包路径,指定与之前使用 add_package_path() 方法时 所加载的包相同的路径。
1 | /** |
Config Loader config($file, $use_sections = FALSE, $fail_gracefully = FALSE)
Loads a config file (an alias for CI_Config::load()).
1 | public function config($file, $use_sections = FALSE, $fail_gracefully = FALSE){ |
Helper Loader helper($helpers = array())
该方法用于加载辅助函数文件,其中 file_name 为加载的文件名,不带 _helper.php
后缀。
1 | /** |
Language Loader language($files, $lang = ‘’)
1 | public function language($files, $lang = ''){ |
Driver Loader driver($library, $params = NULL, $object_name = NULL)
该方法用于加载驱动器类,和 library() 方法非常相似,另外你可以同时加载多个驱动器,只需给 driver 方法传入一个包含所有要载入的驱动器名的数组即可。
1 | public function driver($library, $params = NULL, $object_name = NULL){ |
Database Loader database($params = ‘’, $return = FALSE, $query_builder = NULL)
该方法用于加载数据库类,有两个可选的参数。
1 | /** |
加载核心类方法簇:ci_load_library($class, $params = NULL, $object_name = NULL),ci_load_stock_library($library_name, $file_path, $params, $object_name),ci_init_library($class, $prefix, $config = FALSE, $object_name = NULL)
类库文件可以被保存到主 libraries 目录的子目录下面,或者保存到个人的 application/libraries 目录下。要载入子目录下的文件,只需将路径(你可以随心所欲地将文件保存到多层的子目录下)包含进来就可以了,注意这里说的路径是指相对于 libraries 目录的路径。
该方法用于加载核心类,$library为相应类名,$params为实例化此类的时候可能要用到的参数,$object_name为给这个类的实例自定义一个名字。
1 | public function library($library, $params = NULL, $object_name = NULL){ |
ci_load_library($class, $params = NULL, $object_name = NULL)
1 | /** |
ci_load_stock_library($library_name, $file_path, $params, $object_name)
1 | protected function _ci_load_stock_library($library_name, $file_path, $params, $object_name){ |
ci_init_library($class, $prefix, $config = FALSE, $object_name = NULL)
1 | /** |
Load model model($model, $name = ‘’, $db_conn = FALSE)
该方法用于加载模型,如果你的模型位于子目录下,加载时将路径包含进来即可。
1 | public function model($model, $name = '', $db_conn = FALSE){ |
dbutil($db = NULL, $return = FALSE)
该方法用于加载数据库工具类。
1 | public function dbutil($db = NULL, $return = FALSE){ |
dbforge($db = NULL, $return = FALSE)
该方法用于加载数据库工厂类。
1 | public function dbforge($db = NULL, $return = FALSE){ |
Load view view($view, $vars = array(), $return = FALSE)
该方法用于加载你的视图文件。
1 | public function view($view, $vars = array(), $return = FALSE){ |
Load file ile($path, $return = FALSE)
这是一个通用的文件载入方法,在第一个参数中给出文件所在的路径和文件名, 将会打开并读取对应的文件。默认情况下,数据会被发送给浏览器, 就如同视图文件一样,但如果你将第二个参数设置为 TRUE , 那么数据就会以字符串的形式被返回,而不是发送给浏览器。
1 | public function file($path, $return = FALSE){ |
总结
Loader是CI框架中组件加载的管理器,而Loader是在CI_Controller中被加载的:$this->load =& load_class('Loader', 'core'); $this->load->initialize();
。在Loader的initialize的过程中对autoload做了相应的处理,当然并不是所有的类库都需要通过CI的autoload加载,因为该类库在框架初始化的时候就被加载,而不管你是不是需要使用该类库,这样实际上会有一定的性能损失。如果你的类库并不是所有应用都需要的,那么更好的方法是需要时再加载。在结束本文前我们来梳理下CI_Loader调用流程: