コードモジュール

CodeIgniter は、再利用可能なコードを作成するのに役立つコードモジュール化の形式をサポートしています。モジュールは通常、特定の主題を中心に構成され、大規模なアプリケーション内のミニアプリケーションと考えることができます。

コントローラー、モデル、ビュー、設定ファイル、ヘルパー、言語ファイルなど、フレームワーク内の標準ファイルタイプのいずれもサポートされています。モジュールには、これらのファイルを必要なだけ含めることができます。

モジュールを Composer パッケージとして作成する場合は、Composer パッケージの作成 も参照してください。

名前空間

モジュール機能の中核となる要素は、CodeIgniter が使用する PSR-4 互換の自動読み込み です。どのコードでも PSR-4 オートローダーと名前空間を使用できますが、モジュールを最大限に活用する主な方法は、コードに名前空間を付けて **app/Config/Autoload.php** の $psr4 プロパティに追加することです。

たとえば、アプリケーション間で再利用できるシンプルなブログモジュールを保持したいとします。すべてのモジュールを格納するために、会社名 Acme を使用したフォルダを作成します。これは、メインプロジェクトルートの **app** ディレクトリのすぐ横に配置します

acme/        // New modules directory
app/
public/
system/
tests/
writable/

**app/Config/Autoload.php** を開き、$psr4 配列プロパティに Acme\Blog 名前空間を追加します

<?php

namespace Config;

use CodeIgniter\Config\AutoloadConfig;

class Autoload extends AutoloadConfig
{
    public $psr4 = [
        APP_NAMESPACE => APPPATH, // For custom namespace
        'Config'      => APPPATH . 'Config',
        'Acme\Blog'   => ROOTPATH . 'acme/Blog',
    ];

    // ...
}

これで設定が完了したので、Acme\Blog 名前空間を通じて **acme/Blog** フォルダ内の任意のファイルにアクセスできます。これだけでモジュールの動作に必要な 80% が処理されるため、名前空間に精通し、その使用に慣れるようにしてください。定義されたすべての名前空間を通じて、いくつかのファイルタイプが自動的にスキャンされます。これは、モジュールを操作するための重要な要素です。

モジュール内の一般的なディレクトリ構造は、メインアプリケーションフォルダを模倣します

acme/
    Blog/
        Config/
        Controllers/
        Database/
            Migrations/
            Seeds/
        Helpers/
        Language/
            en/
        Libraries/
        Models/
        Views/

もちろん、この正確な構造を使用することを強制するものは何もなく、モジュールに最適な方法で編成する必要があります。不要なディレクトリは省略し、エンティティ、インターフェース、リポジトリなどの新しいディレクトリを作成します。

クラス以外のファイルの自動読み込み

多くの場合、モジュールには PHP クラスだけでなく、手続き型関数、ブートストラップファイル、モジュール定数ファイルなど、通常はクラスのようにロードされない他のファイルも含まれます。これに対する1つのアプローチは、ファイルを使用するファイルの先頭で require することです。

CodeIgniter が提供するもう1つのアプローチは、クラスを自動ロードするのと同じように、これらの*クラス以外の*ファイルを自動ロードすることです。必要なのは、これらのファイルへのパスのリストを提供し、**app/Config/Autoload.php** ファイルの $files プロパティに含めることだけです。

<?php

namespace Config;

use CodeIgniter\Config\AutoloadConfig;

class Autoload extends AutoloadConfig
{
    // ...

    public $files = [
        'path/to/my/functions.php',
        'path/to/my/constants.php',
        'path/to/my/bootstrap.php',
    ];

    // ...
}

自動検出

多くの場合、含めたいファイルに完全な名前空間を指定する必要がありますが、CodeIgniter は、次のようなさまざまなファイルタイプを自動的に検出することで、アプリケーションへのモジュールの統合を簡素化するように設定できます。

これは、ファイル **app/Config/Modules.php** で設定されます。

自動検出システムは、**Config/Autoload.php** および Composer パッケージで定義されている psr4 名前空間内の特定のディレクトリとファイルをスキャンすることで機能します。

検出プロセスは、そのパスで検出可能なアイテムを探し、たとえば **acme/Blog/Config/Routes.php** にルートファイルを見つけ出すはずです。

検出の有効化/無効化

$enabled クラス変数を使用して、システム内のすべての自動検出をオンまたはオフにできます。False にするとすべての検出が無効になり、パフォーマンスが最適化されますが、モジュールと Composer パッケージの特別な機能が無効になります。

検出項目の指定

$aliases オプションを使用すると、自動的に検出されるアイテムを指定できます。アイテムが存在しない場合、そのアイテムの自動検出は行われませんが、配列内の他のアイテムは引き続き検出されます。

検出と Composer

PSR-4 名前空間を使用して Composer 経由でインストールされたパッケージもデフォルトで検出されます。PSR-0 名前空間のパッケージは検出されません。

Composer パッケージの指定

バージョン 4.3.0 で追加。

無関係な Composer パッケージのスキャンに時間を無駄にしないように、**app/Config/Modules.php** の $composerPackages 変数を編集して、検出するパッケージを手動で指定できます

<?php

namespace Config;

use CodeIgniter\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    // ...

    public $composerPackages = [
        'only' => [
            // List up all packages to auto-discover
            'codeigniter4/shield',
        ],
    ];

    // ...
}

または、検出から除外するパッケージを指定することもできます。

<?php

namespace Config;

use CodeIgniter\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    // ...

    public $composerPackages = [
        'exclude' => [
            // List up packages to exclude.
            'pestphp/pest',
        ],
    ];

    // ...
}

Composer パッケージの検出の無効化

ファイルを検索するときに、Composer の既知のディレクトリがすべてスキャンされないようにするには、**app/Config/Modules.php** の $discoverInComposer 変数を編集してオフにすることができます

<?php

namespace Config;

use CodeIgniter\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    public $discoverInComposer = false;

    // ...
}

ファイルの操作

このセクションでは、各ファイルタイプ(コントローラー、ビュー、言語ファイルなど)と、モジュール内でどのように使用できるかについて説明します。この情報のいくつかは、ユーザーガイドの関連する場所でより詳細に説明されていますが、ここでは、すべての部分がどのように組み合わされるかを理解しやすくするために、再現されています。

ルート

デフォルトでは、ルート はモジュール内で自動的にスキャンされます。これは、上記の **Modules** 設定ファイルでオフにすることができます。

注意

ファイルは現在のスコープに含まれているため、$routes インスタンスはすでに定義されています。そのクラスを再定義しようとするとエラーが発生します。

モジュールを操作する場合、アプリケーション内のルートにワイルドカードが含まれていると問題が発生する可能性があります。その場合は、ルートの優先順位 を参照してください。

フィルター

バージョン 4.4.2 以降は非推奨。

注意

この機能は非推奨です。次のように レジストラ を代わりに使用してください

<?php

namespace CodeIgniter\Shield\Config;

use CodeIgniter\Shield\Filters\SessionAuth;
use CodeIgniter\Shield\Filters\TokenAuth;

class Registrar
{
    /**
     * Registers the Shield filters.
     */
    public static function Filters(): array
    {
        return [
            'aliases' => [
                'session' => SessionAuth::class,
                'tokens'  => TokenAuth::class,
            ],
        ];
    }
}

デフォルトでは、フィルター はモジュール内で自動的にスキャンされます。これは、上記の **Modules** 設定ファイルでオフにすることができます。

注意

ファイルは現在のスコープにインクルードされるため、$filters インスタンスは既に定義されています。このクラスを再定義しようとするとエラーが発生します。

モジュールの **Config/Filters.php** ファイルで、使用するフィルターのエイリアスを定義する必要があります。

<?php

$filters->aliases['menus'] = \App\Filters\MenusFilter::class;

コントローラー

メインの **app/Controllers** ディレクトリ以外の場所に配置されたコントローラーは、URI 検出によって自動的にルーティングすることはできません。Routes ファイル内で明示的に指定する必要があります。

<?php

// Routes.php
$routes->get('blog', '\Acme\Blog\Controllers\Blog::index');

ここで必要な入力量を減らすために、**group** ルーティング機能が役立ちます。

<?php

$routes->group('blog', ['namespace' => 'Acme\Blog\Controllers'], static function ($routes) {
    $routes->get('/', 'Blog::index');
});

設定ファイル

設定ファイルを扱う際に特別な変更は必要ありません。これらは依然として名前空間を持つクラスであり、new コマンドでロードされます。

<?php

$config = new \Acme\Blog\Config\Blog();

設定ファイルは、常に利用可能な config() 関数を使用し、短いクラス名を渡すことで自動的に検出されます。

注意

モジュールで同じ短いクラス名を使用することはお勧めしません。**app/Config/** 内の既知の設定をオーバーライドまたは追加する必要があるモジュールは、暗黙的レジストラ を使用する必要があります。

注意

v4.4.0 より前では、config() は、config(\Acme\Blog\Config\Blog::class) のような完全修飾クラス名を指定した場合でも、同じ短縮名を持つクラスが存在する場合、**app/Config/** 内のファイルを検索していました。この動作は v4.4.0 で修正され、指定されたインスタンスが返されるようになりました。

マイグレーション

マイグレーションファイルは、定義された名前空間内で自動的に検出されます。すべての名前空間で見つかったすべてのマイグレーションは、毎回実行されます。

シード

シードファイルは、完全な名前空間が指定されている限り、CLI から使用することも、他のシードファイル内から呼び出すこともできます。CLI で呼び出す場合は、二重バックスラッシュを指定する必要があります。

Unix の場合

php spark db:seed Acme\\Blog\\Database\\Seeds\\TestPostSeeder

Windows の場合

php spark db:seed Acme\Blog\Database\Seeds\TestPostSeeder

ヘルパー

ヘルパーは、helper() 関数を使用すると、名前空間 **Helpers** ディレクトリ内にある限り、定義された名前空間内で自動的に検出されます。

<?php

helper('blog');

名前空間を指定できます。詳細は、指定された名前空間からの読み込み を参照してください。

言語ファイル

言語ファイルは、lang() メソッドを使用すると、ファイルがメインアプリケーションディレクトリと同じディレクトリ構造に従っている限り、定義された名前空間から自動的に検出されます。

ライブラリ

ライブラリは常に完全修飾クラス名でインスタンス化されるため、特別なアクセスは提供されません。

<?php

$lib = new \Acme\Blog\Libraries\BlogLib();

モデル

new キーワードを使用してモデルを完全修飾クラス名でインスタンス化する場合は、特別なアクセスは提供されません。

<?php

$model = new \Acme\Blog\Models\PostModel();

モデルファイルは、常に利用可能な model() 関数を使用することで自動的に検出されます。

注意

モジュールで同じ短いクラス名を使用することはお勧めしません。

注意

model() は、model(\Acme\Blog\Model\PostModel::class) のような完全修飾クラス名を指定した場合でも、同じ短縮名を持つクラスが存在する場合、**app/Models/** 内のファイルを検索します。これは、model() がデフォルトで preferApp を使用する Factories クラスのラッパーであるためです。詳細は、クラスの読み込み を参照してください。

ビュー

ビューは、ビュー ドキュメントに記載されているように、クラスの名前空間を使用してロードできます。

<?php

echo view('Acme\Blog\Views\index');