創(chuàng)建核心系統(tǒng)類(lèi)?

每次CodeIgniter 運(yùn)行時(shí),都有一些基礎(chǔ)類(lèi)伴隨著核心框架自動(dòng)的被初始化。但你也可以使用你自己的類(lèi)來(lái)替代這些核心類(lèi)或者擴(kuò)展這些核心類(lèi)。

大多數(shù)用戶一般不會(huì)有這種需求,但對(duì)于那些想較大幅度的改變 CodeIgniter 核心的人來(lái)說(shuō),我們依然提供了替換和擴(kuò)展核心類(lèi)的選擇。

注解

變動(dòng)核心系統(tǒng)類(lèi)意味著一系列的挑戰(zhàn),所以,請(qǐng)三思后行。

系統(tǒng)類(lèi)列表?

以下是系統(tǒng)核心文件的列表,它們?cè)诿看?CodeIgniter 啟動(dòng)時(shí)被調(diào)用:

  • 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

替換核心類(lèi)?

要使用你的系統(tǒng)類(lèi)替換 CodeIgniter 默認(rèn)的系統(tǒng)類(lèi)時(shí),首先確保 Autoloader 能找到你的類(lèi);其次你的新類(lèi)繼承了正確的接口,同時(shí)修改 Service 以保證加載的是你自己的類(lèi)。

例如,你有一個(gè)名為 `` AppLibrariesRouteCollection `` 的新類(lèi)想要替換系統(tǒng)的核心類(lèi),你應(yīng)該像這樣創(chuàng)建你的類(lèi):

class RouteCollection implements \CodeIgniter\Router\RouteCollectionInterface
{

}

然后,你應(yīng)該修改路由文件來(lái)加載你自己的類(lèi):

public static function routes($getShared = false)
{
        if (! $getShared)
        {
                return new \App\Libraries\RouteCollection();
        }

        return self::getSharedInstance('routes');
}

擴(kuò)展核心類(lèi)?

如果你需要往一個(gè)現(xiàn)有的庫(kù)里添加一些功能-或許只是添加一兩個(gè)方法,重寫(xiě)這整個(gè)庫(kù)顯然是沒(méi)必要的。這時(shí)更好的通常是對(duì)其中的類(lèi)進(jìn)行擴(kuò)展。對(duì)類(lèi)進(jìn)行擴(kuò)展與替換掉類(lèi)幾乎相同,除了一點(diǎn):

  • 類(lèi)的聲明必須繼承父類(lèi)。

比如,繼承 RouteCollection 這個(gè)原生類(lèi),你應(yīng)該這樣聲明:

class RouteCollection extends \CodeIgniter\Router\RouteCollection
{

}

如果你需要在類(lèi)中使用構(gòu)造器來(lái)確保子類(lèi)繼承了父類(lèi)的構(gòu)造器:

class RouteCollection implements \CodeIgniter\Router\RouteCollection
{
    public function __construct()
    {
        parent::__construct();
    }
}

Tip: 在你自己的類(lèi)中,所有與父類(lèi)方法名相同的函數(shù)將會(huì)覆蓋父類(lèi)方法,此為”方法覆蓋”. 這樣你就可以充分地改動(dòng)CodeIgniter 的核心類(lèi)。

你若擴(kuò)展了控制器核心類(lèi),則需確保你的新類(lèi)繼承了應(yīng)用下的控制器類(lèi)的構(gòu)造器:

class Home extends App\BaseController {

}