🔥
CodeIgniter4 独自ドライバーによるデータベースクラスの拡張
はじめに
クエリ結果の生成に使用する 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;
}
}
※結果行を取得する getRowArray
は getResultArray
をコールしている為、拡張不要でした。
独自ドライバーの利用
.env
- database.default.DBDriver = Postgre
+ database.default.DBDriver = App\Database\MyDriver\Postgre
注意
当然ですが、データベースクラスの拡張は CodeIgniter モデルの挙動にも影響を及ぼします。
今回の拡張であれば find
等のメソッドによる結果取得の際にも trim
の結果が適用されるようになります。
Discussion