Codeigniter MY_Controller:是不是只能扩展一次核心?

Posted

技术标签:

【中文标题】Codeigniter MY_Controller:是不是只能扩展一次核心?【英文标题】:Codeigniter MY_Controller: is it only possible to extend core once?Codeigniter MY_Controller:是否只能扩展一次核心? 【发布时间】:2011-12-21 16:59:31 【问题描述】:

我已按照 CI 文档中的说明使用 MY_Controller 成功扩展了核心。

这样我可以在 MY_Controller 的构造函数中放入一些重复的函数(即身份验证检查),这样它们总是在我的其他控制器的方法之前运行。

我现在的问题是我的 web 应用程序的某些部分是打开的(即不需要登录)而其他部分需要登录。

因此,我无法从 MY_Controller(包含身份验证功能)扩展我的所有控制器。

我想知道是否可以扩展核心以拥有例如 LOG_Controller 和 NOLOG_Controller。

然后,需要登录的控制器将扩展自 LOG_Controller --- 而不需要登录的控制器将扩展自 NOLOG_Controller。

这可能吗? (或者是不好的形式?)

似乎 config/config.php 只允许 one 核心扩展前缀,所以我不确定它是否可能。

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

【问题讨论】:

【参考方案1】:

看看这篇文章http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY - 这正是你要找的。​​p>

【讨论】:

是的,这正是我正在考虑的帽子,谢谢参考 看起来很干净,但我无法在我的安装中使用它。我可能在不同的版本上 已经 4 年了,该网站正在运行。避免只放置链接并接受仅包含链接的答案。【参考方案2】:

我使用以下技巧。在 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

【讨论】:

@torr 这正是我所做的。它就像一个魅力。我有一点不同的用例。在我的示例中,我让 MY_Controller 做一些我需要的基本工作(比如设置布局/模板)。然后我有一个继承 MY_Controller 的“Secure_Controller”。从那里我有不同的控制器用于我网站的各个区域/部分。轻松更改身份验证、布局等。 “胖”控制器会在一定程度上影响性能,但我无法想象你在这些控制器中做任何疯狂的事情。只是基本的设置,无论如何你都必须做。 @torr MY_Controller.php 会在每个请求中加载,这就是为什么保持苗条是个好主意。 tx aquilaX +1 的概念 - 我选择了一个链接到 Phil Sturgeon 的一个很好的指南的答案 - 菲尔在那篇文章的 cmets 中说你的方法有效,但可能会不必要地膨胀如果一个人不小心保持控制器的瘦身 该死的另一个线程建议编辑配置文件以加载所有核心控制器,我不愿意这样做,发现这个,这个解决方案太棒了!而且您实际上可以拥有 n 个核心控制器 :)【参考方案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();
    

您希望在您的应用程序中同时允许 some 受保护和 some 不受保护的控制器。为了保护这些控制器,它们必须扩展 MY_Controller 并继承它的 __construct() 方法。对于不需要继承 __construct() 方法的任何控制器,您只需直接扩展 CI_Controller,如下所示:

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

class Insecure extends CI_Controller

    function __construct() 
        parent::__construct();
    

你有它。直接从(extendCI_Controller 继承的控制器将是“不安全的”。

一个考虑

这里的主要考虑因素是,您的控制器中可能有其他方法要传递给所有您的控制器 - 在这种情况下,这可能不是您的最佳解决方案。如果 的情况,您可以随时将这些方法移至 helper

【讨论】:

【参考方案4】:

我认为这是不可能的。有多种方法可以扩展同一个控制器。为什么不将所有打开的页面放在一个文件夹(如 Public)中,如果请求被定向到该文件夹​​,请检查 MY_Controller。如果没有,则需要身份验证。

【讨论】:

【参考方案5】:

另一个简单的解决方案是在 application/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 项目,所以我会更进一步,但我相信你也可以在其他地方玩一些配置变量,使其更加干燥

【讨论】:

以上是关于Codeigniter MY_Controller:是不是只能扩展一次核心?的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 中扩展多个核心控制器

CodeIgniter 2:如何多次扩展 CI_Controller?

路由中uri slug的codeigniter正则表达式

CodeIgniter 和 DataMapper ORM

如何在 Codeigniter 4 中扩展控制器?

无法在 Codeigniter 中删除 index.php