Php Codeigniter MY_控制器:是否只能扩展核心一次?

Php Codeigniter MY_控制器:是否只能扩展核心一次?,php,codeigniter,controller,Php,Codeigniter,Controller,如CI文档所述,我已使用MY_控制器成功扩展了内核 通过这种方式,我可以在我的_控制器的构造函数中放入一些重复函数(即auth check),以便它们总是在其他控制器的方法之前运行 我现在的问题是,我的webapp的某些部分是开放的(即,不需要登录),而其他部分则需要登录 因此,我无法从我的_控制器(包含身份验证检查函数)扩展所有控制器 我想知道是否有可能扩展内核,以便拥有LOG_控制器和NOLOG_控制器 然后,需要登录的控制器将从LOG_控制器扩展,而不需要登录的控制器将从NOLOG_控制器

如CI文档所述,我已使用MY_控制器成功扩展了内核

通过这种方式,我可以在我的_控制器的构造函数中放入一些重复函数(即auth check),以便它们总是在其他控制器的方法之前运行

我现在的问题是,我的webapp的某些部分是开放的(即,不需要登录),而其他部分则需要登录

因此,我无法从我的_控制器(包含身份验证检查函数)扩展所有控制器

我想知道是否有可能扩展内核,以便拥有LOG_控制器和NOLOG_控制器

然后,需要登录的控制器将从LOG_控制器扩展,而不需要登录的控制器将从NOLOG_控制器扩展

这可能吗?(还是形式不好?)

config/config.php似乎只允许一个核心扩展前缀,所以我不确定这是否可行


让我知道你的想法,或者是否有更好的方法。谢谢。

我想这是不可能的。有几种方法可以完成扩展同一控制器所需的工作。为什么不将所有打开的页面放在一个文件夹(如Public)中,并在myu控制器中检查请求是否指向该文件夹。如果不是,则需要身份验证

我使用以下技巧。在My_Controller.php中定义所有基本控制器:

<?php

class My_Controller extends CI_Controller{

}

class LOG_Controller extends My_Controller{

} 

class NOLOG_Controller extends My_Controller{

}
?>

这将使所有定义的控制器在以后的控制器中可用。只需避免使基础控制器太胖


您还可以查看此示例:

看看这篇文章-这正是您要查找的内容。

另一个简单的解决方案是只需要在应用程序/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");

对我来说似乎很枯燥,然后允许您通过在某处设置templates/layouts控制器目录来定制应用程序。我刚刚完成一个较旧的CI项目,因此我将进一步介绍它,但我相信您也可以在其他地方使用一些配置变量,使其更加枯燥,因为您没有发布任何源代码,让我们想象一下您的
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');
        }
    }
}
class Secure extends MY_Controller
{
    function __construct() {
        parent::__construct();
    }
}
class Insecure extends CI_Controller
{
    function __construct() {
        parent::__construct();
    }
}
您的“受保护”控制器扩展此控制器并继承其方法,如下所示:

文件路径:application/controllers/Secure.php

class MY_Controller extends CI_Controller
{
    function __construct() {
        parent::__construct();

        if ( !$this->ion_auth->logged_in() ) {
            redirect('auth/login');
        }
    }
}
class Secure extends MY_Controller
{
    function __construct() {
        parent::__construct();
    }
}
class Insecure extends CI_Controller
{
    function __construct() {
        parent::__construct();
    }
}
您希望在应用程序中同时允许一些受保护和一些不受保护的控制器。为了保护这些控制器,它们必须扩展
MY\u Controller
并继承它的
\u construct()
方法。对于不需要继承该
\u construct()
方法的任何控制器,只需直接扩展
CI\u控制器,如下所示:

文件路径:application/controllers/unsecure.php

class MY_Controller extends CI_Controller
{
    function __construct() {
        parent::__construct();

        if ( !$this->ion_auth->logged_in() ) {
            redirect('auth/login');
        }
    }
}
class Secure extends MY_Controller
{
    function __construct() {
        parent::__construct();
    }
}
class Insecure extends CI_Controller
{
    function __construct() {
        parent::__construct();
    }
}
给你。直接从
CI\u控制器继承(扩展)的控制器将是“不安全的”

一个考虑
这里主要考虑的是,您的控制器中可能有其他方法,您希望将这些方法传递给您的所有控制器-在这种情况下,这可能不是您的最佳解决方案。如果是这样的话,你可以把那些方法移到一个助手那里。它就像一个符咒。我有一个稍微不同的用例。在我的例子中,我让我的_控制器做一些我需要的基本工作(比如设置布局/模板)。然后我有一个“安全的\u控制器”,它继承了我的\u控制器。在那里,我为我的站点的各个区域/部分配备了不同的控制器。轻松更改身份验证、布局等。“胖”控制器会在某种程度上影响性能,但我无法想象你会在这些控制器中做任何疯狂的事情。只是一些你无论如何都必须做的基本设置工作。@torr MY_Controller.php会在每个请求中加载,这就是为什么保持苗条是个好主意。tx aquilaX+1的概念-我选择了一个链接到Phil Sturgeon关于这一点的优秀指南的答案-Phil在那篇文章的评论中说,你的方法是有效的,但如果不小心保持控制器苗条,可能会不必要地膨胀另一个线程建议编辑配置文件加载所有的核心控制器,我不愿意这样做,并发现这一点,这个解决方案是可怕的!事实上,你可以有n个核心控制器:)是的,这正是我所想的,thx用于刷新,但我无法让它在我的安装中工作。我可能在另一个版本上,已经4年了,那个网站正在运行。避免只放置链接,也不要接受只包含链接的答案。