【问题标题】:How to load hook for particular controller如何为特定控制器加载钩子
【发布时间】:2015-03-27 08:14:15
【问题描述】:

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

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

【问题讨论】:

    标签: codeigniter codeigniter-2 codeigniter-routing


    【解决方案1】:

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

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

    public $is_hookable = TRUE;
    

    然后在你的钩子函数中这样做:

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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      请看清楚文档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}
      

      【讨论】:

      • 我知道亲爱的.. Bt 如何为特定控制器加载。不适合所有人
      【解决方案3】:
          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');
                  }
              }
      
          }
      
      }
      

      【讨论】:

        【解决方案4】:

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

        system/core/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!');
            }
        }
        

        application/hooks/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'));
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          相关资源
          最近更新 更多