CodeIgniter 3.1と4.1の違い

(最終更新:2021-12-02)

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する必要があるため、それができない場所では使えない
    • それ以前にセットしたCookieを送信するには、redirect()->withCookies()とする必要がある
    • それ以前にセットしたヘッダーを送信するには、redirect()->withHeaders()とする必要がある
  • バリデーション
    • 変数の値を変更しなくなった
    • 例えば、trimを指定しても検証中はtrimされるが、検証後の変数の値自体は変更されない
    • 値を整形する関数を指定しても無意味(検証中のそのルールの処理時に実行され値が一時的に整形されるが、false が返った場合にのみ検証が失敗とされる。次のルールの処理時には元の値が使用される)
  • バリデーションルール
    • フォーマットのルールは空文字を許可しなくなった
    • 空文字を許可したい場合は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

CodeIgniter 4.1の処理の流れ

(2022-10-31 追記) 「CodeIgniter 4.3の処理の流れ」 を書きました。

CodeIgniter 4.1の処理の流れをまとめました。

public/index.php

  1. PHPのバージョンをチェック
  2. 定数FCPATHを定義
  3. Config\Pathsをインスタンス化
  4. system/bootstrap.phpをロードしCodeIgniterをインスタンス化し$appに代入
  5. $app->run()

system/bootstrap.php

  1. パスに関する定数を定義
  2. Config/Constants.phpをロード
  3. Common.phpをロード
  4. オートローダーをロード
  5. サービスロケーターをロード
  6. オートローダーを初期化
  7. Composerオートローダーをロード
  8. DotEnvをインスタンス化し実行
  9. CodeIgniterをインスタンス化して$appに代入
  10. $app->initialize()
  11. $appを返す

CodeIgniter::initialize()

  1. 環境を検出
  2. 環境別のbootファイル(Config/Boot/環境.php)をロード
  3. 例外ハンドラを設定
  4. PHP機能拡張をチェック
  5. デフォルトロケールを設定
  6. デフォルトタイムゾーンを設定
  7. Kintを初期化

CodeIgniter::run()

  1. Requestオブジェクトを取得
  2. Responseオブジェクトを取得
  3. forceGlobalSecureRequestsを処理
  4. リクエストメソッドSpoofingを処理
  5. ページキャッシュをチェック
  6. リクエストを処理(handleRequest())

CodeIgniter::handleRequest()

  1. ルーティングを処理しフィルターを検索
  2. フィルターがあれば有効化
  3. beforeフィルターを実行
  4. コントローラを実行
    • クロージャーコントローラーなら実行
    • コントローラーをインスタンス化
    • コントローラーのメソッドを実行
  5. 出力を収集
  6. afterフィルターを実行
  7. Responseを送信
  8. Responseオブジェクトを返す

関連

Tags: codeigniter, codeigniter4