创建核心系统类
每次 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
替换核心类
要使用您自己的系统类来代替默认类,请确保
创建您的类
例如,如果您有一个新的 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 核心。