建立核心系統類別

每當 CodeIgniter 執行時,都會有幾個基本類別作為核心框架的一部份,自動地初始化。但是,你可以使用自己的版本來替換掉任何一個核心的系統類別,甚至可以繼承後擴充核心版本。

大多數的使用者永遠不需要這麼做,但對於想顯著改變 CodeIgniter 核心的使用者,可以選擇替換或擴充它們。

備註

搞亂核心系統類別將會有很多影響,所以在嘗試這件事情之前,要確定你知道自己在做什麼。

系統類別列表

以下是每次 CodeIgniter 在執行時呼叫的系統檔案列表

  • Config\Services
  • CodeIgniter\Autoloader\Autoloader
  • CodeIgniter\Config\DotEnv
  • CodeIgniter\Controller
  • CodeIgniter\Debug\Exceptions
  • CodeIgniter\Debug\Timer
  • CodeIgniter\Events\Events
  • CodeIgniter\HTTP\CLIRequest (if launched from command line only)
  • CodeIgniter\HTTP\IncomingRequest (if launched over HTTP)
  • CodeIgniter\HTTP\Request
  • CodeIgniter\HTTP\Response
  • CodeIgniter\HTTP\Message
  • CodeIgniter\HTTP\URI
  • CodeIgniter\Log\Logger
  • CodeIgniter\Log\Handlers\BaseHandler
  • CodeIgniter\Log\Handlers\FileHandler
  • CodeIgniter\Router\RouteCollection
  • CodeIgniter\Router\Router
  • CodeIgniter\Security\Security
  • CodeIgniter\View\View
  • CodeIgniter\View\Escaper

替換核心類別

要使用自己的系統類別來替代掉預設的系統類別,請確定 Autoloader 可以找得到你的類別,以及你的新類別實作了相應的介面,並修改 Service 來載入你的類別替換掉核心類別。

例如,你有一個新的 App\Libraries\RouteCollection 類別,你想用它來替換掉系統核心類別,你就可這樣創建你的類別:

<?php

namespace App\Libraries;

use CodeIgniter\Router\RouteCollectionInterface;

class RouteCollection implements RouteCollectionInterface
{
    // ...
}

然後,你得修改在 app/Config/Services.phproutes 服務,改成載入你的類別:

public static function routes(bool $getShared = true)
{
    if ($getShared)
    {
        return static::getSharedInstance('routes');
    }

    return new RouteCollection(static::locator(), config('Modules'));
}

擴充核心系統類別

如果你只需要在現有的程式庫中添加一些功能(也許是一兩個方法),那麼重新撰寫整個程式庫有點矯枉過正了。在這種情形下,最簡單的方法就是擴充類別,擴充類別與替換類別幾乎一模一樣,只有一個例外:

  • 類別必須繼承父類別。

舉個例子,要擴充原生的 RouteCollection 類別,你得這麼做:

<?php

namespace App\Libraries;

use CodeIgniter\Router\RouteCollection;

class RouteCollection extends RouteCollection
{
    // ...
}

如果你需要在你的類別中使用建構函數,請確定你同時執行了父類別的擴充函數:

<?php

namespace App\Libraries;

use CodeIgniter\Router\RouteCollection as BaseRouteCollection;

class RouteCollection extends BaseRouteCollection
{
    public function __construct()
    {
        parent::__construct();

        // your code here
    }
}

Tip : 在你的類別中,任何與父類別相同的函數都將被使用,而不會使用原生的函數,這就是所謂的方法覆寫,你可以利用這種方式大幅度地修改 CodeIgniter 的核心。