我已经使用CI的文档中描述的MY_Controller成功扩展了核心。
这样我可以在MY_Controller的构造函数中放置一些重复的函数(即auth check),这样它们总是在我的其他控制器的方法之前运行。
我现在的问题是我的webapp的某些部分是开放的(即不需要登录)而其他部分需要登录。
因此,我无法从MY_Controller(包含auth检查功能)扩展我的所有控制器。
我想知道是否可以扩展核心以便拥有LOG_Controller和NOLOG_Controller。
然后,需要登录的控制器将从LOG_Controller扩展---并且不需要登录的控制器将从NOLOG_Controller扩展。
这可能吗? (或者是不好的形式?)
似乎config / config.php只允许 一个 核心扩展名前缀,所以我不确定它是否可行。
让我知道您的想法或是否有更好的方法。感谢。
答案 0 :(得分:10)
看一下这篇文章http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY - 这正是你要找的。 p>
答案 1 :(得分:7)
我使用以下技巧。在My_Controller.php中定义所有基本控制器:
<?php
class My_Controller extends CI_Controller{
}
class LOG_Controller extends My_Controller{
}
class NOLOG_Controller extends My_Controller{
}
?>
这使得所有定义的控制器稍后在控制器中可用。只是避免使基本控制器太胖。
您也可以查看此示例:https://github.com/aquilax/novigeroi2/blob/master/application/core/AQX_Controller.php
答案 2 :(得分:3)
由于您尚未发布任何源代码,我们假设您的MY_Controller
看起来类似于以下示例:
文件路径: application / core / MY_Controller.php
class MY_Controller extends CI_Controller
{
function __construct() {
parent::__construct();
if ( !$this->ion_auth->logged_in() ) {
redirect('auth/login');
}
}
}
你的“受保护”控制器扩展了这个并继承了它的方法,如下所示:
文件路径: application / controllers / Secure.php
class Secure extends MY_Controller
{
function __construct() {
parent::__construct();
}
}
您希望在应用程序中同时允许某些受保护和某些未受保护的控制器。为了保护这些控制器,它们必须扩展MY_Controller
并继承它的__construct()
方法。对于任何不需要继承__construct()
方法的控制器,只需直接扩展CI_Controller
,如下所示:
文件路径: application / controllers / Insecure.php
class Insecure extends CI_Controller
{
function __construct() {
parent::__construct();
}
}
你有它。直接从( extend )继承CI_Controller
的控制器将是“不安全的”。
此处的主要考虑因素是您可能在控制器中有其他方法要传递给所有您的控制器 - 在这种情况下,这可能不是您的最佳解决方案。如果 这种情况,您可以随时将这些方法移至帮助。
答案 3 :(得分:0)
我认为这是不可能的。有一些方法可以做你需要的扩展同一个控制器。为什么不将所有打开的页面放在一个文件夹(如Public)中,如果请求被定向到该文件夹,则检查MY_Controller。如果没有,需要auth。
答案 4 :(得分:0)
另一个简单的解决方案是只需要在应用程序/ controller / my_controller.php文件底部需要额外的类/控制器
我的自定义控制器如下所示,不需要任何其他配置设置:
class My_Controller extends CI_Controller {
// do something clever here
}
// do something even more clever here ...
require_once("application/core/tool_controller.php");
对我来说似乎非常干燥,然后允许您通过在某处设置模板/布局控制器目录来自定义您的应用程序。我刚刚完成了一个较旧的CI项目,所以我正在进一步研究它,但我相信你也可以在其他地方使用一些配置变量来使它更干净