创建核心系统类
每次 CodeIgniter 运行时,都会有几个基本类作为核心框架的一部分自动初始化。但是,可以将任何核心系统类替换为自己的版本,甚至只是扩展核心版本。
大多数用户永远不需要这样做,但对于那些想要大幅更改 CodeIgniter 核心的人来说,替换或扩展它们的选择确实存在。
重要
修改核心系统类会产生很多影响,因此在尝试之前请确保您知道自己在做什么。
系统类列表
以下是每次 CodeIgniter 运行时调用的核心系统类的列表
CodeIgniter\Autoloader\AutoloaderCodeIgniter\Autoloader\FileLocatorCodeIgniter\Cache\CacheFactoryCodeIgniter\Cache\Handlers\BaseHandlerCodeIgniter\Cache\Handlers\FileHandlerCodeIgniter\Cache\ResponseCacheCodeIgniter\CodeIgniterCodeIgniter\Config\BaseServiceCodeIgniter\Config\DotEnvCodeIgniter\Config\FactoriesCodeIgniter\Config\ServicesCodeIgniter\ControllerCodeIgniter\Cookie\CookieCodeIgniter\Cookie\CookieStoreCodeIgniter\Debug\ExceptionsCodeIgniter\Debug\TimerCodeIgniter\Events\EventsCodeIgniter\Filters\FiltersCodeIgniter\HTTP\CLIRequest(仅在从命令行启动时)CodeIgniter\HTTP\ContentSecurityPolicyCodeIgniter\HTTP\HeaderCodeIgniter\HTTP\IncomingRequest(如果通过 HTTP 启动)CodeIgniter\HTTP\MessageCodeIgniter\HTTP\OutgoingRequestCodeIgniter\HTTP\RequestCodeIgniter\HTTP\ResponseCodeIgniter\HTTP\SiteURICodeIgniter\HTTP\SiteURIFactoryCodeIgniter\HTTP\URICodeIgniter\HTTP\UserAgent(如果通过 HTTP 启动)CodeIgniter\Log\LoggerCodeIgniter\Log\Handlers\BaseHandlerCodeIgniter\Log\Handlers\FileHandlerCodeIgniter\Router\RouteCollectionCodeIgniter\Router\RouterCodeIgniter\SuperglobalsCodeIgniter\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 核心。