CodeIgniter4のFactoriesとは?

この記事は CodeIgniter Advent Calendar 2022 - Qiita の13日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

CodeIgniter4の基本的な機能であるFactoriesについての解説記事がなかったので、書くことにします。

Factoriesとは?

CodeIgniter4のFactoriesとは、クラスをロードする仕組みです。 CodeIgniter3の $this->load に似ています。

Factoriesは要求されたクラスのオブジェクトを生成し返します。

また、Factoriesは生成したオブジェクトを共有します。

オブジェクトの取得方法

Factoriesは CodeIgniter\Config\Factories クラスとして実装されています。

メソッド名としてクラスのあるサブ名前空間を指定し、第一引数にロードするクラス名を指定します。

use CodeIgniter\Config\Factories;

$users = Factories::models('UserModel');

上記のコードは、App\Models にある UserModel クラスをインスタンス化して返します。

共有オブジェクトの取得

デフォルトでは、一度インスタンス化されたオブジェクトは共有されます。

同じコードを実行した場合は、全く同じインスタンスが返ります。

$users = Factories::models('UserModel');

config() と model() 関数

関連する関数として、config()model() があります。

それぞれ、\CodeIgniter\Config\Factories::config()\CodeIgniter\Config\Factories::models() のラッパーです。

つまり、設定クラスとモデルクラスをロードします。

Servicesとの違い

Servicesについては、「CodeIgniter4のServicesとは?」を参照してください。

Factoriesはインスタンス化するために具体的なクラス名を必要とし、インスタンスを作成するためのコードを保持できません。

そのため、依存オブジェクトを必要とするようなインスタンスを組み立てることはできません。 しかし、FactoriesはServicesとは異なり、設定なしでクラスをインスタンス化できます。

一方、Servicesにはインスタンスを作成するコードの記述が必要なため、他のサービスまたはオブジェクトを必要とするインスタンスを組み立てることもできます。

また、サービスの取得は、クラス名ではなくサービス名で行われるため、クライアントコードを全く変更せずに、返されるインスタンスを変更できます。

まとめ

  • Factoriesとはクラスをロードする仕組みです。
  • Factoriesは指定されたクラスのインスタンスを生成し、また、共有します。
  • Servicesとは異なり設定なしで使えますが、1つのクラスをインスタンス化して共有するだけで、依存オブジェクトを必要とするようなインスタンスを組み立てることはできません。

この記事は CodeIgniter Advent Calendar 2022 - Qiita の13日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

関連

参考

Date: 2022/12/13

Tags: codeigniter, codeigniter4