【问题标题】:Run a function each time a page loads in CodeIgniter每次在 CodeIgniter 中加载页面时运行一个函数
【发布时间】:2011-09-30 09:16:41
【问题描述】:

我以前只在 Asp.Net MVC 中制作过 Web 应用程序,您可以在 BaseController 上设置的“ActionFilter”中使用 OnResultExecuted 来在每次执行操作方法时运行方法(即基本上每次有人访问任何应用程序中的页面)。

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

编辑:

根据其中一项建议,我尝试使用 post_controller_constructor 代替,但这无济于事:

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

我仍然得到未定义的属性:PreController::$input(我只是没有重命名被调用的类,如果它暂时仍然被称为 PreController 应该没关系)。

但事实仍然是我无权访问输入属性...显然我无权访问输入类,那么我该怎么做呢?我相信如果我在 Controller 中做同样的事情会没问题,但是从一个钩子?我该怎么做?

【问题讨论】:

    标签: php codeigniter-2 pageload


    【解决方案1】:

    您可以为此使用 CodeIgniter 钩子:http://www.codeigniter.com/user_guide/general/hooks.html

    您可以挂钩几个“事件”,请查看文档页面的底部。


    回应评论:

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

    您需要在钩子处理程序中做的第一件事是获取实际控制器,该控制器将包含输入引用和其他内容。

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

    【讨论】:

    • 很好的答案,谢谢,这正是我想要的。不过,这只是一个后续问题。我需要能够访问诸如输入类和用户代理类中的方法之类的东西,例如在钩子里。要获取用户的 IP 地址,请检查机器人等。但是如何从配置的钩子类中访问这些。假设我将我的钩子类(PreController)放入文件夹钩子中。如果我尝试通过例如访问输入类echo $this->input->ip_address();它不起作用,未定义是错误消息...请注意我是新手:-)
    • pre_controller 挂钩在超级对象完全构造之前执行,因此您将无法访问输入或用户代理类。见stackoverflow.com/questions/2196559/…。解决方案是改用post_controller_constructor 钩子。
    • @AndersSvensson:就像提到的birderic,你应该连接到post_controller_constructor。这会给你一个初始化的 CI 实例(包括 URI 段、会话数据和其他好东西),你仍然可以做一些事情,比如重定向到不同的控制器/动作/URI。
    • 经过一番挖掘,了解了您的最后一个问题。下次请贴出实际代码,这样会更容易理解和“调试”。
    • 啊,好吧,我不知道它是这样工作的,关于 CI 中的工作方式仍然有些模糊。当我没有让它工作时,我实际上在 MY_Controller 中做了我需要的东西,这样我就可以继续前进,但我会试试这个。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2012-08-13
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多