创建核心系统类

每次 CodeIgniter 运行时,都会有几个基本类作为核心框架的一部分自动初始化。但是,可以将任何核心系统类替换为自己的版本,甚至只是扩展核心版本。

大多数用户永远不需要这样做,但对于那些想要大幅更改 CodeIgniter 核心的人来说,替换或扩展它们的选择确实存在。

重要

修改核心系统类会产生很多影响,因此在尝试之前请确保您知道自己在做什么。

系统类列表

以下是每次 CodeIgniter 运行时调用的核心系统类的列表

  • CodeIgniter\Autoloader\Autoloader

  • CodeIgniter\Autoloader\FileLocator

  • CodeIgniter\Cache\CacheFactory

  • CodeIgniter\Cache\Handlers\BaseHandler

  • CodeIgniter\Cache\Handlers\FileHandler

  • CodeIgniter\Cache\ResponseCache

  • CodeIgniter\CodeIgniter

  • CodeIgniter\Config\BaseService

  • CodeIgniter\Config\DotEnv

  • CodeIgniter\Config\Factories

  • CodeIgniter\Config\Services

  • CodeIgniter\Controller

  • CodeIgniter\Cookie\Cookie

  • CodeIgniter\Cookie\CookieStore

  • CodeIgniter\Debug\Exceptions

  • CodeIgniter\Debug\Timer

  • CodeIgniter\Events\Events

  • CodeIgniter\Filters\Filters

  • CodeIgniter\HTTP\CLIRequest (仅在从命令行启动时)

  • CodeIgniter\HTTP\ContentSecurityPolicy

  • CodeIgniter\HTTP\Header

  • CodeIgniter\HTTP\IncomingRequest (如果通过 HTTP 启动)

  • CodeIgniter\HTTP\Message

  • CodeIgniter\HTTP\OutgoingRequest

  • CodeIgniter\HTTP\Request

  • CodeIgniter\HTTP\Response

  • CodeIgniter\HTTP\SiteURI

  • CodeIgniter\HTTP\SiteURIFactory

  • CodeIgniter\HTTP\URI

  • CodeIgniter\HTTP\UserAgent (如果通过 HTTP 启动)

  • CodeIgniter\Log\Logger

  • CodeIgniter\Log\Handlers\BaseHandler

  • CodeIgniter\Log\Handlers\FileHandler

  • CodeIgniter\Router\RouteCollection

  • CodeIgniter\Router\Router

  • CodeIgniter\Superglobals

  • CodeIgniter\View\View

替换核心类

要使用您自己的系统类来代替默认类,请确保

  1. 自动加载器 可以找到您的类,

  2. 您的新类实现了相应的接口,

  3. 并修改相应的 服务 以加载您的类来代替核心类。

创建您的类

例如,如果您有一个新的 App\Libraries\RouteCollection 类,您想用它来代替核心系统类,您可以像这样创建您的类

<?php

namespace App\Libraries;

use CodeIgniter\Router\RouteCollectionInterface;

class RouteCollection implements RouteCollectionInterface
{
    // ...
}

添加服务

然后您将在 **app/Config/Services.php** 中添加 routes 服务来加载您的类

<?php

namespace Config;

use CodeIgniter\Config\BaseService;

class Services extends BaseService
{
    public static function routes(bool $getShared = true)
    {
        if ($getShared) {
            return static::getSharedInstance('routes');
        }

        return new \App\Libraries\RouteCollection(static::locator(), config(Modules::class), config(Routing::class));
    }

    // ...
}

扩展核心类

如果您只需要向现有库添加一些功能——也许添加一两个方法——那么重新创建整个库就太过分了。在这种情况下,最好简单地扩展该类。扩展类与 替换核心类 几乎相同,只有一个例外

  • 类声明必须扩展父类。

例如,要扩展本机 RouteCollection 类,您将使用以下方式声明您的类:

<?php

namespace App\Libraries;

use CodeIgniter\Router\RouteCollection as BaseRouteCollection;

class RouteCollection extends BaseRouteCollection
{
    // ...
}

如果您需要在您的类中使用构造函数,请确保您扩展了父构造函数

<?php

namespace App\Libraries;

use CodeIgniter\Router\RouteCollection as BaseRouteCollection;

class RouteCollection extends BaseRouteCollection
{
    public function __construct()
    {
        parent::__construct();

        // your code here
    }
}

提示: 您的类中任何与父类方法同名的函数都将被使用,而不是原生的函数(这被称为“方法重写”)。 这允许您大幅更改 CodeIgniter 核心。