a-blog cms で DI(Dependency Injection)

公開日:

目次

今回の記事では a-blog cms で 依存性注入(Dependency Injection)をする方法について記事を書いていきたいと思います。

依存性注入(Dependency Injection)とは

依存性注入(Dependency Injection)とは通称 DI と呼ばれ、デザインパターンの一種だそうです。例えば クラスA が クラスB を呼び出すことを前提としている場合、クラスA は クラスB に依存しているということができます。しかしこの状態では クラスA を単体テストすることができません。なぜなら、クラスA を単体テストしようと思った場合、クラスBを呼び出す必要があるためです。これは最早単体テストではなく、結合テストになってしまいます。

そこで、クラスA のコンストラクタの引数としてクラスBを受け取ったり、クラスA にセッター関数を用意して、そのセッター関数の引数としてクラスB を受け取ることでクラスA がクラスB に依存しないようにすることができます。これが依存性注入(Dependency Injection)です。詳しい説明はネットで調べればわかりやすい記事がたくさん出てくるのでここでは省略します。

a-blog cms で 依存性注入(Dependency Injection)

a-blog cms でも 依存性注入(Dependency Injection)するための機能が用意されています。a-blog cms で 依存性の注入(Dependency Injection)を実装する場合は、拡張アプリを作成する場合が多いので拡張アプリ作成時を想定して説明します。

a-blog cms で拡張アプリを作成する場合は ServiceProvider.php というファイルを作成すると思います。ServiceProvider.phpApp クラスをインポートします。そして注入するクラスを定義します。注入するクラスを名前空間も含めて記述する点に注意です。

// ServiceProvider.php

<?php

namespace Acms\Plugins\SampleApp;

// その他のファイルのインポート
use ACMS_App;
use App; // Appクラスのインポート

class ServiceProvider extends ACMS_App
{
    /* 省略 */

    /**
     * サービスの初期処理
     */
    public function init()
    {
        App::singleton('sample_app', '\Acms\Plugins\SampleApp\Models\SampleApp'); // 注入するクラスを設定
        /* その他の処理 */
    }

    /* 省略 */
}

ServiceProvider.php 内の init 関数の中で注入するクラス、つまり、依存先のクラスを指定しています。上記の例では \Acms\Plugins\SampleApp\Models\SampleApp クラスを sample_app という名前で呼び出せるように設定しています。

構文の意味はこちらです。

App::singleton(呼び出しに必要な名前(文字列), 依存先のクラス);

ここまで、記述できたら後は拡張アプリ上の好きなところから、先程依存先として設定したクラスを sample_app という名前で呼び出すことができます。↓の例は、Hook.php (フック処理を追加できるファイル)の afterPostFire メソッド内で SampleApp クラス を呼び出しています。

// Hook.php(拡張アプリ内)

<?php

namespace Acms\Plugins\SampleApp;

use App; // Appクラスのインポート

class Hook
{
   /**
   * POSTモジュール処理後
   * $thisModuleのプロパティを参照・操作するなど
   *
   * @param ACMS_POST $thisModule
   */
  public function afterPostFire($thisModule)
  {
      $moduleName = get_class($thisModule);

      switch($moduleName) {
          case 'ACMS_POST_Form_Submit':
          // エントリー更新の後に処理を行う
        
          // 依存先クラスのコンストラクタを生成(newするのと同じ)
          $api = App::make('sample_app'); 

    // SampleApp クラスの save メソッドを実行
    $api->save();
        
          break;
      }
  }
}

設定したクラスを使用したい PHP ファイル内で App クラスをインポートして App::make の引数に sample_app を渡すことでコンストラクタを生成しています。これで Hook.php 内で SampleApp クラスのメソッドを実行できるようになりました。

まとめ

今回は a-blog cms で依存性注入(Dependency Injection)をする方法について解説してみました。拡張アプリを作成する場合に便利かと思いますので、a-blog cmsの拡張アプリを作りたいという方はぜひ使ってみてください。