ci-phpunit-testの正式リリース(v1.0.0、v2.0.0、v3.0.0)

初の正式リリース

2021/03/03にCodeIgniter 3でPHPUnitでのテストを簡単に書くためのツール「ci-phpunit-test」のv1.0.0、v2.0.0、v3.0.0をリリースしました。

調べてみると、最初のリリースv0.1.0は2015/06/12でした。 ということで、「構想3か月、開発5年」みたいな長大なプロジェクトに結果的になりました。

ここまでで合計38回のリリース、18人のコントリビューター、Composerからの累計ダウンロード数37万回以上になりました。

ただし、GitHubスターがまだ536と少ないです。特に日本人は少ないので、ユーザーのかたは遠慮なくスターをガンガン押してください!

PHPUnitのバージョンとの対応

何故、3つもバージョンをリリースしたかというと、PHPUnit(とPHP)のバージョンアップに対応するためです。今のところそれ以外に機能的な差異はありません。

PHPUnitでテストを書いていますが、ブランチを分けないとテストが簡単に書けなくなりました。

ci-phpunit-test PHP PHPUnit
v3.0.0 PHP 7.3以降 PHPUnit 9.3以降
v2.0.0 PHP 7.2以降 PHPUnit 8.1から9.2
v1.0.0 PHP 5.4.0以降 (5.6以降を推奨) PHPUnit 4.3から7.5 (4.8以降を推奨)

今後

今後は、v3.xをメインのバージョンとして、必要があれば古いバージョンもメンテしていこうと思います。

CodeIgniter4への対応

なお、ci-phpunit-test for CodeIgniter4の作成予定はありません。これは、多くの機能がCodeIgniter4に含まれたため、必要性があまりないためです。

ただし、全ての機能がCodeIgniter4に含まれるわけではないので、以下のパッケージで不足する機能(モック作成のヘルパーメソッド、モンキーパッチ、$this->request)を提供していきます。

以下のテストコードのように既存のテストコードをあまり変更せずにCodeIgniter4でも使えるようになります。

モンキーパッチについて

最後に、今までモンキーパッチについて、きちんと説明を書いたことがないので、ここに記載しておきます。

モンキーパッチは自転車の補助輪のようなものです。プロダクトコードに問題がなければ、本来必要ありません。個人的にも私は自分が書いたコードでモンキーパッチを使ったことはありません。

モンキーパッチを使わないとテストが書けない場合は、設計に問題があると思ってほぼ間違いありません。設計を見直してください。

そうは言っても、サードパーティのツールがexit()していたり、過去のレガシーコードをまだ使わざるを得なくモックに差し替えられないというような場合のために、一応、機能を提供しています。

できるだけ早く、モンキーパッチを使わなくて済む環境を目指してください。

関連

Tags: codeigniter, phpunit, testing, release

CodeIgniter 3.1と4.1の違い

(最終更新:2021/03/09)

CodeIgniter 3.1と4.1の違いについて簡単にまとめていきます。

動作環境

  • CodeIgniter 3.1
    • PHP 5.6以上推奨
    • PHP 5.3.7で動作
  • CodeIgniter 4.1
    • PHP 7.3以上

重要な変更点

その他の主な追加機能

主なコーディングの違い

  • PSR-4に準拠するクラス名及びクラスファイル名
  • ビュー及びヘルパー以外の全てに名前空間が必要
    • アプリケーションのデフォルトの名前空間はApp
    • 設定の名前空間はConfig
  • $this->load->xxx()がなくなる
  • コンポーネントのロード方法
    • CodeIgniterのクラス(コアクラス、ライブラリ)
      • Config\Services
      • service()
      • session()
    • モデル
      • newする
      • Factories
      • model()
    • ライブラリ
      • newする
      • Factories
    • 設定
      • newする
      • Factories
      • config()
    • ビュー
      • view()
      • ビューは中身をechoするか、returnするか、Responseオブジェクトにセットする
    • ヘルパー
      • helper()
      • コントローラーの$helpersプロパティ
  • コントローラーは次のプロパティを自動的に持つ
    • Requestオブジェクト $this->request
    • Responseオブジェクト $this->response
    • Loggerオブジェクト $this->logger

細かな仕様変更

細かい仕様変更については、把握し切れていません。それほどないと思いますが。

  • redirect()
    • 引数と戻り値が完全に変わっているので注意
    • コントローラーからRedirectResponsereturnする必要があるため、それができない場所では使えない
  • 検証
    • 変数の値を変更しなくなった
    • 例えば、trimを指定しても検証中はtrimされるが、検証後の変数の値自体は変更されない
  • 検証ルール
    • フォーマットのルールは空文字を許可しなくなった
    • 空文字を許可したい場合はpermit_emptyを追加する

参考

Tags: codeigniter, codeigniter4

CodeIgniter 4.1のDatabase Query関連のクラス図

CodeIgniter 4.1.1のDatabase Query関連のクラスを理解するために、クラス図を書きましたので、残しておきます。

(2021/02/24追記) クラス図を更新しました。

クラス図

UML

@startuml

interface ConnectionInterface {
    BaseBuilder : table($tableName)
    query(string $sql, $binds)
}

abstract class BaseConnection implements ConnectionInterface {
    #$lastQuery
    query(string $sql, $binds, ...)
    #execute(string $sql)
}

BaseConnection ..> Query : create

class SQLite3\Connection extends BaseConnection {
    bool : isWriteType()
    execute(string $sql)
}

interface QueryInterface {
    bool : isWriteType()
}

class Query implements QueryInterface
{
    bool : isWriteType()
}

Query o-- ConnectionInterface

class Postgre\Query extends Query {
    bool : isWriteType()
}
note right of Postgre\Query : This is just an example.\nIt doesn't exist yet.

class BaseBuilder {
    #$db : ConnectionInterface
    string : compileFinalQuery()
}

BaseBuilder <.. ConnectionInterface : create
BaseBuilder ..> Query : create

interface PreparedQueryInterface {
    prepare(string $sql, array $options)
    execute(...$data)
}

abstract class BasePreparedQuery implements PreparedQueryInterface {
    #$query : Query
    #$db : BaseConnection
    prepare(string $sql, array $options, string $queryClass)
    execute(...$data)
}

BasePreparedQuery ..> Query : create

@enduml

Tags: codeigniter, codeigniter4, database