在视图加载时调用Codeigniter控制器函数

时间:2015-04-22 21:18:53

标签: php codeigniter

任务

在每次新页面加载时从数据库中获取用户的余额。无法存储在会话中,因为有一个奖励系统可以在用户登录时添加到用户的余额中。

在我的页面设置方式中,它有4个部分:

$this->load->view('head'); //Head, meta, css, js
$this->load->view('navbar'); //Strip 50px height at top of page. Has navigation, logout and user balance
$this->load->view('xxx'); //Unique page content
$this->load->view('footer'); //standard footer

我可以通过附加参数将信息传递给视图:

$this->load->view('navbar', $balance);

然而,这意味着每次调用页面时,我都必须从控制器某处调用数据库。

我正在寻找的是每次调用navbar view时如何实现这一点的想法,它会自动调用一个返回用户余额的控制器函数。

我想象这样的事情:

$this->load->view('navbar', function getBalance() {
   return callControllerAndGetBalance();
});

有一个肮脏的想法是在页面加载的AJAX中调用navbar调用控制器,然后更改值,但这似乎是错误的。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用CodeIgniter挂钩:

https://ellislab.com/codeigniter/user-guide/general/hooks.html

未经测试,但这是我认为它必须工作的方式。从我在评论中添加的quora链接中获取此信息,看起来就像是在调用$ controller =& get_instance();那么这就是控制器,您可以为它添加一个属性,它将在那里供您查看。

我也可以使用不同的选项,这可能很有希望取决于你在__construct方法中做了什么:

<强> post_controller_constructor 在实例化控制器之后立即调用,但在任何方法调用发生之前调用。

class Blog extends CI_Controller{    

       public $balance = 0;

       public function getBalance(){        
             $this->balance = Balance::getMe();   
       }
}

你可以做的是从钩子中调用get_instance帮助函数。

class PostControllerHook{  
      function post_controller($params)  {     
          // $params[0] = 'controller' (given the params in the question)     
          // $controller is now your controller instance,     
          // the same instance that just handled the request     
          $controller =& get_instance();     
          $controller->getBalance();  
      }
}

然后使用

$this->load->view('navbar', $this->balance);