如何为特定控制器加载钩子

时间:2015-03-27 08:14:15

标签: codeigniter codeigniter-2 codeigniter-routing

我是codeigniter的新手。我想加载管理面板控制器的钩子。

$hook['post_controller_constructor'][] = array(
    'class'    => 'AdminData',
    'function' => 'myfunction',
    'filename' => 'loginhelp.php',
    'filepath' => 'hooks',
    'params'   => array()
);

4 个答案:

答案 0 :(得分:3)

请清楚阅读该文件https://ellislab.com/codeigniter/user-guide/general/hooks.html

  

通过设置,可以全局启用/禁用挂钩功能   application / config / config.php文件中的以下项目:

$config['enable_hooks'] = TRUE;
  

钩子在application / config / hooks.php文件中定义。

您无法为特定控制器加载它。您需要在钩子函数中检查控制器名称并编写代码。假设您的post_controller_constructor挂钩函数名称为myfunction,您可以在函数

中查看它
 $CI =& get_instance();
 if($CI ->router->class=="AdminData"){//write your code}

答案 1 :(得分:3)

好的,这是最简单的方法:

  

在控制器中声明一个公共变量

public $is_hookable = TRUE;
  

然后在你的钩子函数内执行此操作:

$ci=&get_instance();

if($ci->is_hookable){
  ... enter whatever you want here;
}

希望这很有帮助

答案 2 :(得分:1)

    Application/config/hooks.php

    $hook['post_controller'] = array(
            'class'    => 'LogoutBlockedUser',
            'function' => 'logout',
            'filename' => 'LogoutBlockedUser.php',
            'filepath' => 'hooks',
            'params'   => ""
    );

    Enable hooks in config.php
    $config['enable_hooks'] = TRUE;

    Application/hooks/LogoutBlockedUser.php

    class LogoutBlockedUser {


    public function __construct()
    {

    }

    public function logout()
    {
        $CI =& get_instance();
        if(!(empty($CI->session->userdata('user_id'))))
        {
            $CI->load->model('Your_model', 'web');
            $result = $CI->common->select_query;
            if(!empty($result))
            {
                $CI->session->unset_userdata('user_id');
                session_destroy();
                redirect(base_url() . 'yourcontroller/function');
            }
        }

    }

}

答案 3 :(得分:0)

加载post_controller_constructor后调用$class挂钩。加载的类基于路由参数。

<强>系统/核心/ Codeigniter.php

/**
 *<code>
 *  http://example.com/adminData/method
 *</code>
 *
 * $CI = new adminData(); => application/controllers/adminData.php
**/
$CI = new $class();

$EXT->call_hook('post_controller_constructor'); 

因此,如果你想在adminData控制器上调用一个方法,你可以这样做。

这种方法并不理想,因为它不是很像OOP,但是从设计的角度来看CI的构建方式,你必须做一些解决方法,如下面的例子

<强>应用/控制器/ adminData.php

class AdminData extends CI_Controller
{
    public function __construct(){}

    // This cannot be called directly in the browser
    public function _filter()
    {
        /**
         * Put your logic in here
         *<code>
         * $this->model->logic()
         *</code>
        **/
        exit('I have just be called!');
    }
}

<强>应用/钩/ loginhelp.php

class AdminData
{
    protected $ci;

    public function __construct()
    {
        global $CI;
        $this->ci = $CI;
    }

    public function myfunction()
    {
        // If the class is not == AdminData, just bail
        if(get_class($this->ci) != 'AdminData') return;

        if(!is_callable(array($this->ci, '_filter'))) return;

        //calls $AdminData->_filter()
        return call_user_func(array($this->ci, '_filter'));
    }
}