创建核心系统类
每次 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 核心。