PHPで自作のパッケージを作成してみた。

はじめに

次世代デジタル基盤開発事業部の植木です。
主に、Web3領域のNFT関連のアプリの開発を行っております。

自作のPHPのパッケージを作成しようと思った経緯について

以前、電子申請のシステムに携わることがありました。その際、生年月日を和暦から西暦、西暦から和暦に変換する処理を実装する箇所が多々ありました。
それなら、ライブラリーにしたらと思い、PHPのパッケージ制作を思い立ちました。

パッケージの機能について

日付を和暦から西暦、西暦から和暦に変換する機能です。

パッケージの構造は、以下となります。

// パッケージの構造

├── .gitignore
├── .php-cs-fixer.cache
├── composer.json
├── composer.lock
├── src
│   └── JapaneseNengoGenerator.php
├── tests
│   └── JapaneseNengoGeneratorTest.php
└── vendor
└── LICENSE

実際の日付を和暦から西暦、西暦から和暦にする処理の結果は、連想配列で返すようにしています。

// 日付を和暦から西暦、西暦から和暦にする処理

   /**
    * 西暦→和暦変換
    *
    * @param string $time 変換対象となる日付(西暦)
    * @return array $result 変換後の日付(和暦)
    *
    */
    public function toWareki($time = 'now')
    {
        // 元号一覧
        $eraNameList = [
        // 令和(2019年5月1日〜)
        [
            'jp' => '令和',
            'time' => '20190501'
        ],
        // 平成(1989年1月8日〜)
        [
            'jp' => '平成',
            'time' => '19890108'
        ],
        // 昭和(1926年12月25日〜)
        [
            'jp' => '昭和',
            'time' => '19261225'
        ],
        // 大正(1912年7月30日〜)
        [
            'jp' => '大正',
            'time' => '19120730'
        ],
        ];

        $date = '';
        try {
            $date = new \DateTime($time);
        } catch (\Exception $e) {
            // 日付型の指定でない
            echo $e->getMessage();
        }

            $result = [
              'wareki' => '',
              'year' => '',
              'month' => sprintf('%02d', $date->format('m')),
              'day' => sprintf('%02d', $date->format('d'))
            ];

        foreach ($eraNameList as $el) {
            $dateEraName = new \DateTime($el['time']);
            if ($date->format('Ymd') >= $dateEraName->format('Ymd')) {
                $result['year'] = sprintf('%02d', $date->format('Y') - $dateEraName->format('Y') + 1);
                if ($result['year'] == '01') {
                    $result['year'] = '元年';
                }
                $result['wareki'] = $el['jp'];
                break;
            }
        }

        return $result;
    }

    /**
    * 和暦→西暦変換
    *
    * @param string $time 変換対象となる日付(和暦)
    * @return array $result 変換後の日付(西暦)
    *
    */
    public function toSeireki($time)
    {
        $time = str_replace('元年', '1年', mb_convert_kana($time, 'n'));

        if (preg_match('!^(大正|昭和|平成|令和)([0-9]+)年([0-9]+)月([0-9]+)日$!', $time, $matches)) {
            $eraName = $matches[1];
            $year = intval($matches[2]);
            $month = intval($matches[3]);
            $day = intval($matches[4]);

            if ($eraName === '大正') {
                $year += 1911;
            } elseif ($eraName === '昭和') {
                $year += 1925;
            } elseif ($eraName === '平成') {
                $year += 1988;
            } elseif ($eraName === '令和') {
                $year += 2018;
            }

            return [
                'year' => sprintf('%04d', $year),
                'month' => sprintf('%02d', $month),
                'day' => sprintf('%02d', $day)
            ];
        }
        return [];
    }

パッケージの公開方法

まず、GitHubに向けて、tagをつけてプッシュします。

git tag 1.0.0
git push origin 1.0.0


PackagistにパッケージのGithubのリポジトリを登録する。(赤枠の部分)

b1

PackagistからPayload URLを取得する。


PackagistよりAPI トークンを取得する。


Payload URLとAPI トークンを利用して、GitHubとPackagistをウェブフックで連動させる設定を行う。

これで公開は完了です!


パッケージの利用方法

<?php

require 'vendor/autoload.php';

use hoge\nengo\JapaneseNengoGenerator;

$nengo = new JapaneseNengoGenerator();
var_dump($nengo->toWareki(20220112));

// array(4) {
//     ["wareki"]=>
//     string(6) "令和"
//     ["year"]=>
//     string(2) "04"
//     ["month"]=>
//     string(2) "01"
//     ["day"]=>
//     string(2) "12"
//  }

まとめ

パッケージの作成方法や公開方法の流れを紹介させていただきました。

自作したパッケージに対して、どのようなテストを行なったか。(ユニットテスト)や LICENSE(基本MIT)やREADMEにパッケージの利用方法を記載したので、お時間ある方はぜひご覧になってください。

採用リンク tecotec.co.jp