我正在codeIgniter中制作一个PHP应用程序,希望能够灵活地使用钩子。但是,codeIgniter中的钩子数量有限,所以我想创建自己的钩子。我该怎么做?
k7fdbhmy1#
您应该打开system/core/Codeigniter.php并查看调用钩子的位置以及在页面生命周期的哪个部分调用钩子。在第299行,有一个钩子被调用,然后一个$class被初始化,然后另一个钩子被调用。
system/core/Codeigniter.php
$class
$EXT->_call_hook('pre_controller'); $CI = new $class(); $EXT->_call_hook('pre_controller_constructor');
因此,Codeigniter将获取pre_controller钩子列表,并在$class初始化之前执行这些钩子。在$class初始化之后,__constructor执行它的任务,__pre_controller_constructor钩子列表将被执行。那么$CI = new $class()是什么呢?$class来自路由器,该路由器此时已经初始化所以如果url指向mysite.com/category/products,那么$class=='category',所以实际发生的是$CI = new Category(); // application/controllers/category.php如果在第232行的函数function &get_instance(){}之前调用了一个钩子,那么你将无法访问super object,因为该函数还没有创建。此时你只处理PHP,并且无法访问框架。有关挂钩的完整文档可在此处找到https://ellislab.com/codeigniter/user-guide/general/hooks.html
pre_controller
__constructor
__pre_controller_constructor
$CI = new $class()
mysite.com/category/products
$class=='category'
$CI = new Category(); // application/controllers/category.php
function &get_instance(){}
super object
1条答案
按热度按时间k7fdbhmy1#
您应该打开
system/core/Codeigniter.php
并查看调用钩子的位置以及在页面生命周期的哪个部分调用钩子。在第299行,有一个钩子被调用,然后一个
$class
被初始化,然后另一个钩子被调用。因此,Codeigniter将获取
pre_controller
钩子列表,并在$class
初始化之前执行这些钩子。在$class
初始化之后,__constructor
执行它的任务,__pre_controller_constructor
钩子列表将被执行。那么
$CI = new $class()
是什么呢?$class
来自路由器,该路由器此时已经初始化所以如果url指向
mysite.com/category/products
,那么$class=='category'
,所以实际发生的是$CI = new Category(); // application/controllers/category.php
如果在第232行的函数
function &get_instance(){}
之前调用了一个钩子,那么你将无法访问super object
,因为该函数还没有创建。此时你只处理PHP,并且无法访问框架。有关挂钩的完整文档可在此处找到https://ellislab.com/codeigniter/user-guide/general/hooks.html