CodeIgniter4 创建核心系统类
每次CodeIgniter 运行时,都有一些基础类伴随着核心框架自动的被初始化。但你也可以使用你自己的类来替代这些核心类或者扩展这些核心类。
大多数用户一般不会有这种需求,但对于那些想较大幅度的改变 CodeIgniter 核心的人来说,我们依然提供了替换和扩展核心类的选择。
注解
变动核心系统类意味着一系列的挑战,所以,请三思后行。
系统类列表
以下是系统核心文件的列表,它们在每次 CodeIgniter 启动时被调用:
- ConfigServices
- CodeIgniterAutoloaderAutoloader
- CodeIgniterConfigDotEnv
- CodeIgniterController
- CodeIgniterDebugExceptions
- CodeIgniterDebugTimer
- CodeIgniterEventsEvents
- CodeIgniterHTTPCLIRequest (if launched from command line only)
- CodeIgniterHTTPIncomingRequest (if launched over HTTP)
- CodeIgniterHTTPRequest
- CodeIgniterHTTPResponse
- CodeIgniterHTTPMessage
- CodeIgniterLogLogger
- CodeIgniterLogHandlersBaseHandler
- CodeIgniterLogHandlersFileHandler
- CodeIgniterRouterRouteCollection
- CodeIgniterRouterRouter
- CodeIgniterSecuritySecurity
- CodeIgniterViewView
- CodeIgniterViewEscaper
替换核心类
要使用你的系统类替换 CodeIgniter 默认的系统类时,首先确保 Autoloader 能找到你的类;其次你的新类继承了正确的接口,同时修改 Service 以保证加载的是你自己的类。
例如,你有一个名为 AppLibrariesRouteCollection
的新类想要替换系统的核心类,你应该像这样创建你的类:
class RouteCollection implements \CodeIgniter\Router\RouteCollectionInterface
{
}
然后,你应该修改路由文件来加载你自己的类:
public static function routes($getShared = false)
{
if (! $getShared)
{
return new \App\Libraries\RouteCollection();
}
return self::getSharedInstance('routes');
}
扩展核心类
如果你需要往一个现有的库里添加一些功能-或许只是添加一两个方法,重写这整个库显然是没必要的。这时更好的通常是对其中的类进行扩展。对类进行扩展与替换掉类几乎相同,除了一点:
- 类的声明必须继承父类。
比如,继承 RouteCollection 这个原生类,你应该这样声明:
class RouteCollection extends \CodeIgniter\Router\RouteCollection
{
}
如果你需要在类中使用构造器来确保子类继承了父类的构造器:
class RouteCollection implements \CodeIgniter\Router\RouteCollection
{
public function __construct()
{
parent::__construct();
}
}
Tip: 在你自己的类中,所有与父类方法名相同的函数将会覆盖父类方法,此为”方法覆盖”. 这样你就可以充分地改动CodeIgniter 的核心类。
你若扩展了控制器核心类,则需确保你的新类继承了应用下的控制器类的构造器:
class Home extends App\BaseController {
}