2011-09-30 97 views
2

我以前只在Asp.Net MVC中创建了Web应用程序,并且可以在每次操作方法时在BaseController上设置的“ActionFilter”中使用OnResultExecuted被执行(即基本上每次任何人访问应用程序中的任何页面)。每次在CodeIgniter中加载一个页面时运行一个函数

我该如何在CodeIgniter/PHP中做同样的事情?

编辑:

我试着用post_controller_constructor相反,根据其中一条建议,但这并不能帮助:

$hook['post_controller_constructor'] = array(
           'class' => 'PreController', 
           'function' => 'getIp', 
           'filename' => 'preController.php', 
           'filepath' => 'hooks' 
           ); 

我仍然得到未定义的属性:PreController :: $输入(I只是没有重命名所调用的类,如果它现在仍然称为PreController,那应该不重要)。

但事实仍然是我没有访问输入属性......显然我没有访问输入类,所以我该怎么做呢?我相信,如果我在控制器中做了同样的事情,它会好起来的,但从钩子?我该怎么做呢?

回答

5

你可以用CodeIgniter的钩子是:http://www.codeigniter.com/user_guide/general/hooks.html

有几个“事件”,你可以挂接到,查看文档页面的底部。


在回应评论:

重读你的评论和编辑......看来你是假设你的挂钩类是电流控制器 - 它不是。当前控制器与URI /路由映射匹配(例如,site.com/users/view/1将使用Users控制器,而不是您的钩子处理程序PreController类)。钩子处理程序可以是一个简单的PHP类,不能从CI_Controller继承。

您需要在钩子处理程序中执行的第一件事是获取包含输入引用等的实际控制器。

class HookHandler { 
    function post_controller_constructor() { 
     $ci =& get_instance(); 
     // ... now you can use $ci->input and other controller members 
    } 
} 
+0

很好的答案,谢谢,这就是我一直在寻找的。不过,只是一个后续问题。我需要能够访问输入类和用户代理类中的方法,例如在钩。要获取用户的IP地址,请检查机器人等。但是,如何从配置的钩子类访问这些地址。说我把我的钩类(PreController)放到文件夹钩子中。如果我尝试通过例如访问输入类echo $ this-> input-> ip_address();它不工作,undefined是错误信息...请注意,我是一个新手:-) – Anders

+0

在超级对象完全构建之前执行'pre_controller'钩子,因此您将无法访问输入或用户代理类。请参阅http://stackoverflow.com/questions/2196559/codeigniter-hooks-pre-controller-loading-helpers。解决方法是使用'post_controller_constructor'钩子代替。 – birderic

+0

请参阅我的编辑...我无法使其工作。 – Anders

相关问题