🔥

CodeIgniter4 独自ドライバーによるデータベースクラスの拡張

2022/12/09に公開

はじめに

クエリ結果の生成に使用する getResultArray 及び getRowArray の処理を拡張したかった。

Creating Core System Classes — CodeIgniter 4.2.10 documentation

上記に該当する箇所ではなかった為、CodeIgniter Forums の情報を基に独自のドライバーを作成することでデータベースクラスの拡張を行なった。

実行環境

  • PHP 8.1.6
  • CodeIgniter 4.2.10
  • PostgreSQL 13.9

独自ドライバーの作成

標準ドライバーで準備されているクラスファイルを全て用意する。

PostgreSQL の場合
CodeIgniter4/system/Database/Postgre at develop · codeigniter4/CodeIgniter4

  • Builder.php
  • Connection.php
  • Forge.php
  • PreparedQuery.php
  • Result.php
  • Utils.php
app\Database\MyDriver\Postgre\Builder.php
<?php

namespace App\Database\MyDriver\Postgre;

class Builder extends \CodeIgniter\Database\Postgre\Builder
{
}
app\Database\MyDriver\Postgre\Connection.php
<?php

namespace App\Database\MyDriver\Postgre;

class Connection extends \CodeIgniter\Database\Postgre\Connection
{
}
app\Database\MyDriver\Postgre\Forge.php
<?php

namespace App\Database\MyDriver\Postgre;

class Forge extends \CodeIgniter\Database\Postgre\Forge
{
}
app\Database\MyDriver\Postgre\PreparedQuery.php
<?php

namespace App\Database\MyDriver\Postgre;

class PreparedQuery extends \CodeIgniter\Database\Postgre\PreparedQuery
{
}
app\Database\MyDriver\Postgre\Result.php
<?php

namespace App\Database\MyDriver\Postgre;

class Result extends \CodeIgniter\Database\Postgre\Result
{
}
app\Database\MyDriver\Postgre\Utils.php
<?php

namespace App\Database\MyDriver\Postgre;

class Utils extends \CodeIgniter\Database\Postgre\Utils
{
}

目的の getResultArray 及び getRowArray が定義されている Result.php へ独自処理を実装する。
(正確には継承元の BaseResult.php で定義されている)

今回は取得する結果に対して、自動で trim が適用されるように拡張を行った。

app\Database\MyDriver\Postgre\Result.php
<?php

namespace App\Database\MyDriver\Postgre;

class Result extends \CodeIgniter\Database\Postgre\Result
{
    public function getResultArray(): array
    {
        $raw_result = parent::getResultArray();
        $result = [];
        foreach($raw_result as $key => $value){
            $result[$key] = array_map('trim', $value);
        }
        return $result;
    }
}

※結果行を取得する getRowArraygetResultArray をコールしている為、拡張不要でした。

独自ドライバーの利用

.env
- database.default.DBDriver = Postgre
+ database.default.DBDriver = App\Database\MyDriver\Postgre

注意

当然ですが、データベースクラスの拡張は CodeIgniter モデルの挙動にも影響を及ぼします。
今回の拡張であれば find 等のメソッドによる結果取得の際にも trim の結果が適用されるようになります。

参考

Discussion