将代码应用于codeigniter中的所有控制器

时间:2015-05-15 03:56:56

标签: php codeigniter codeigniter-3

我有一个简单的代码,我把它放在我的控制器的构造函数

$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0");
$this->output->set_header("Pragma: no-cache");

我使用此代码来注销的安全性。我的问题是,有没有办法将我的代码放入/声明为每个控制器的全局代码?因为在每个控制器的构造函数上很难对所有内容进行硬编码。

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

创建核心控制器可能会很好,但它会应用于应用程序中的每个控制器,问题是,如果您有一个公共页面,而您不想应用该设置,那该怎么办。

我建议您在Controllers文件夹中创建一个控制器,并以您喜欢的方式创建它。

示例:

家长管理员

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Admin extends CI_Controller {

    public function __construct() {
      parent::__construct();
      $this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0");
      $this->output->set_header("Pragma: no-cache");
    }
}

从管理员继承的控制器

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    include APPPATH.'controllers/admin.php';
    class Dashboard extends Admin {

    public function __construct() {
        parent::__construct();
    }
}

观察您需要包含管理员控制器的include APPPATH.'controllers/admin.php';class Dashboard extends Admin {,以便扩展它。

答案 1 :(得分:1)

您可以使用CI挂钩,并使用post_controller_constructor挂钩点来调用挂钩方法并在挂钩中添加标头。

用户指南click here

上提供的集成详细信息

答案 2 :(得分:1)

您可以通过核心目录扩展默认CI_Controller

在application / core / MY_Controller.php中的

:(你的config.php中定义了MY_部分)

class BaseController extends CI_Controller {

    public function __construct() {
      parent::__construct();
      $this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0");
      $this->output->set_header("Pragma: no-cache");
    }
}

然后在您的控制器中使用:

class ControllerXYZ extends BaseController {
    //your code
}

如果您的控制器不需要BaseController的功能,请不要从basecontroller扩展,而是从CI_Controller扩展:

class ControllerXYZ extends CI_Controller {
    //your code without the headers set
}

这还有一个优点,即重复删除每个控制器所需的更多代码,例如检查某人是否已登录,您可以这样做:

class BaseController extends CI_Controller {

      public function __construct() {
          parent::__construct();
          $this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0");
          $this->output->set_header("Pragma: no-cache");

          if(!$this->session->userdata('loggedIn') === True) {
              redirect('/loginpage');
          }
      }
}

有关详细信息,请参阅https://ellislab.com/codeigniter/user-guide/general/core_classes.html

答案 3 :(得分:1)

我喜欢所有的答案,但最好的方法是使用钩子。 首先将它添加到你的hooks.php

 $hook['display_override'] = array(
    'class'    => 'RouteProcess',
    'function' => 'afterroute',
    'filename' => 'RouteProcess.php',
    'filepath' => 'hooks',
    'params'   => array()
 );

然后转到hooks /文件夹并创建RoutesProcess.php 创建以下文件:

class RouteProcess{
function afterroute(){
    $this->CI =&get_instance();
     $this->CI->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0");
    $this->CI->output->set_header("Pragma: no-cache");
    echo $this->CI->output->get_output();
}
}

关于这一点的好处是它不需要调用控制器的__construct()来覆盖它。 无论如何都会调用它。