皆さんは、DGFTのベリトランスの支払決済のPHPのSDKキットを使用したことありますか? それを利用するには彼らのウェブサイトからファイルをダウンロードして、プロジェクトに置いてそれをパッケージとしてインストールします。今回はその仕組みの説明です。ローカルにパッケージを作成してそれをcomposer requireします。
自分のパッケージを作成
まず、デモとしてあるヘルパー関数の定義を含むパッケージを作成します。このパッケージには1つのヘルパー関数しかなく、インストールしたら以下のように、全角の英数字文字列を半角に変換する関数、to_hankaku()を使うことができます。
Psy Shell v0.12.7 (PHP 8.2.15 — cli) by Justin Hileman
> to_hankaku('123');
= "123"
便利そうでしょう。
まず、Laravelのプロジェクトを新規作成して、プロジェクトのディレクトリ直下にpackagesのディレクトリを作成して、以下のような構造で必要なファイルを作成します。
├── app
...
packages
└── larajapan
    └── japanese-utils
        ├── composer.json
        └── src
            └── helpers.php
...
上では、composer.jsonとhelpers.phpのみがファイルで他は皆ディレクトリです。larajapanが開発者のアイデンティティでその下のjapanese-utilsが今回のパッケージ名となります。
まずそのパッケージのcomposer.jsonの中身を見てみましょう(混乱していけないのは、このcomposer.jsonはjapanese-utilsのパッケージのcomposer.jsonであり、これからそれをインストールしようというLaravelのプロジェクト、つまりルートパッケージのcomposer.jsonではありません)。
{
    "name": "larajapan/japanese-utils",
    "description": "helpers to manipuliate a japanese string",
    "version": "1.0.0",
    "require": {
        "php": ">=7.4",
        "ext-mbstring": "*"
    },
    "autoload": {
        "files": [
            "src/helpers.php"
        ]
    }
}
ここでは、パッケージ名(name)、説明(description)、バージョン(version)、必須条件(require)、ロードの指示(autoload)が含まれます。to_hanakaku()の関数では、mbstringのPHPのモジュールのmb_convert()を使用し、さらにタイプヒントも使用するので、それを対応しているPHPバージョン7.4以上であることをインストールの前提とします.
今度は、その関数を定義するhelpers.phpを見てみましょう。
if (!function_exists('to_hankaku')) {
    function to_hankaku(string $zenkaku): string
    {
        return mb_convert_kana($zenkaku, 'as'); // 全角英数字と空白を半角に変換
    }
}
とても簡単な定義ですが、他のパッケージですでに定義されていたら困るので、!function_exists('to_hankaku')の条件を入れています。
Laravelのプロジェクトにインストール
同じプロジェクトのディレクトリ内にパッケージを作成したものの、これだけではプロジェクトで先ほどのto_hanakaku()は使えません。プロジェクトにインストールすることが必要です。
今度は作成したパッケージのではなくプロジェクト(ルートパッケージ)のcomposer.jsonの編集が必要です。以下のrepositoriesのブロックが追加した部分です。
{
    "$schema": "https://getcomposer.org/schema.json",
    "name": "laravel/laravel",
    "type": "project",
    "description": "The skeleton application for the Laravel framework.",
    "keywords": ["laravel", "framework"],
    "license": "MIT",
    "repositories": [
        {
            "type": "path",
            "url": "./packages/larajapan/japanese-utils",
            "options": {
                "symlink": true
            }
        }
    ],
    "require": {
        "php": "^8.2",
        "laravel/framework": "^11.31",
        "laravel/tinker": "^2.9"
    },
...
}
“type”: “path”がローカルのパッケージがレポジトリということを指示し、その場所 “url”にパッケージの相対の場所を指定します。そして、“options”として、“symlink”: trueは、プロジェクトにおいて使用されるパッケージを収めるvendorのディレクトリにおいて、作成したパッケージへのsymlinkを張るという指示です。ちなみにfalseならファイルのコピーとなります。
これでインストールの準備は完了です。通常のパッケージのインストールのようにcomposre requireを実行しましょう。
$ composer require larajapan/japanese-utils
インストール後には、composer.jsonは更新され、“larajapan/japanese-utils”: “^1.0”,のエントリーが追加されているのがわかります。
{
...
    "require": {
        "php": "^8.2",
        "larajapan/japanese-utils": "^1.0",
        "laravel/framework": "^11.31",
        "laravel/tinker": "^2.9"
    },
...
}
vendorのディレクトリを見ると、以下のようにパッケージへのsymlinkとなっています。
$ ls -l vendor/larajapan total 0 lrwxrwxrwx 1 kenji kenji 40 Feb 19 16:42 japanese-utils -> ../../packages/larajapan/japanese-utils/
これで、このLaravelのプロジェクト内で、to_hankaku()のヘルパーをどこでも使えるようになります。
最後に
自分が作成したパッケージは、Packagistに登録したものでもなく、githubのレポジトリに置いたプライベートのパッケージでもありません。そのようなパッケージが必要となるのは不思議と思われるかもしれません。しかし、以下のようにいくつか必要となるケースがあります。
- 将来はPackagistにおいて自分で開発したパッケージを共有したいが、完成度が低いので暫くは自分のプロジェクトだけ使う
- 今まで使用していたgithubにあるパッケージはもうメンテインされていなくダウンロードして自分のプロジェクトだけで使えるようにする
- プロジェクトが肥大化したのでパッケージとしてモジュール化して使う
- あえて自社のサービスのSDKキットをPackagistでパブリックで共有することをせずに、サービスを利用する開発者にローカルにダウンロードしてからcomposerでインストールしてもらう。日本で有名なDGFTのベリトランスの決済のPHPのSDKキットはまさにそれです。
