我有一个简单的代码,我把它放在我的控制器的构造函数
中$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");
我使用此代码来注销的安全性。我的问题是,有没有办法将我的代码放入/声明为每个控制器的全局代码?因为在每个控制器的构造函数上很难对所有内容进行硬编码。
感谢您的帮助。
答案 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()来覆盖它。 无论如何都会调用它。