1 of 32

Composer パッケージを

    自作してみて得られたもの

2023/09/16 PHPカンファレンス沖縄2023

ながまかずま

2 of 32

自己紹介

長間 嘉津馬(ながま かずま)

20年くらいのエンジニア歴で、その8割以上はPHPエンジニアしています

※ 若い方ご存知ないかもしれないですが、Ethna という日本製PHPフレームワークが出た頃から

■ 現在の所属

株式会社SEEC 沖縄営業所 旅行事業部

■ 今興味あること

レガシーなシステムをメンテすることが多いので、最近はレガシーコードを安全に改修・バージョンアップする手法について学習してます

弊社 渡慶次部長 撮影

3 of 32

今回のお話について

パッケージを自作してみて、いくつか得られたものがありました

この話で、誰かしら「自分も何か作ってみようかな…?」という気持ちになってもらえたら嬉しいな、と思っています!

※パッケージの作成方法などについての話はありません…!!すみません

4 of 32

パッケージを自作して得られたもの①

自己肯定感

5 of 32

去年のPHPカンファレンス沖縄2022で

自作パッケージを作った話をさせていただきました

6 of 32

Packagist を見ると、昨日時点で3200超と意外と使っていただいてます

7 of 32

自分が作った物を継続して利用してくれている人がいる

というのが数字で見えると、自己肯定感上がります!

当然やる気が出ますので、バージョンアップもめっちゃやりました。

先月 PHP9 にも対応済です

※PHP9 では動的プロパティ生成が禁止されるため

 動的プロパティ生成をやめてマジックメソッドを経由するように改修

スライドの最後に Qiita の記事リンク貼ってますので、ご興味ありましたら是非使ってみて下さい

8 of 32

パッケージを自作して得られたもの②

メンタルが強くなる

9 of 32

意外に使っていただけたことで調子に乗った僕は

  • QueryBuilder | Eloquent のメソッド名でカラム名と演算子を指定できる
  • 引数が空の場合、そのメソッドを省略してメソッドチェーンできる

という拡張機能(kanagama/eloquent-method-expansion)を作成

10 of 32

QueryBuilder | Eloquent のメソッド名でカラム名と演算子を指定できる

11 of 32

use App\Model\User;

User::whereAgeBetween(20, 30)

->get();

// select * from users where age between 20 and 30;

User::whereLastNameNotEq('長間')

->get();

// select * from users where last_name <> '長間';

User::whereFirstNameIsNotNull()

->get();

// select * from users where first_name is not null;

User::whereLastNameEq('長間')

->whereAgeGte(30)

->orderAgeDesc()

->get();

// select * from users where last_name = '長間' and age >= 30 order by age desc;

12 of 32

引数が空の場合、そのメソッドを省略してメソッドチェーンが可能

13 of 32

管理画面の一覧ページでは、絞り込み条件が多いと思います

14 of 32

// 名字が指定されている

if ($request->last_name) {

$queryBuilder->where('last_name', $request->last_name);

}

// 名前が指定されている

if ($request->first_name) {

$queryBuilder->where('last_name', $request->last_name);

}

// 電話番号が指定されている

if ($request->tel) {

$queryBuilder->where('tel', $request->tel);

}

$reservations = $queryBuilder->get();

特に深く考えずコード化すると if 文分岐で絞り込み

15 of 32

AllowEmpty を追加した場合、空の条件を省略します

// ?tell=09099999999

$reservation = $this->reservationModel

->whereAllowEmptyLastNameEq($request->last_name)

->whereAllowEmptyFirstNameEq($request->first_name)

->whereAllowEmptyTelEq($request->tel)

->whereAllowEmptyRentDateGte($request->rent_date)

->whereAllowEmptyReturnDateLte($request->return_date)

->get();

// select * from

// reservations

// where

// tel = '09099999999'

16 of 32

9ヶ月でインストール数 37

スライドの最後に Qiita の記事リンク貼ってますので、ご興味ありましたら是非使ってみて下さい

17 of 32

自分で作ったモノは「素晴らしい」モノだと感じてしまうことを

心理学では家具大手IKEAさんに例えて「イケア効果」というらしいです

その効果のせいなのか、需要が全然なくても

「みんな分かっていないなぁ…こんなに良いものを…」ってなります

メンタル強くなります

18 of 32

パッケージを自作して得られたもの③

パッケージ自作は意外と簡単

19 of 32

パッケージ公開に最低限必要なディレクトリとファイル

src/ パッケージ本体

composer.json パッケージ設定ファイル

LICENSE ライセンス情報

README.md パッケージ取り扱い説明書

20 of 32

Composer パッケージ自作に技術はあまり必要なし

質の高いコードと高い技術を使ったパッケージは既に優秀な先人達が作ってます

  • composer.json でその優秀なパッケージ達を使わせてもらう
  • src ディレクトリに、その優秀なパッケージを組み合わせて自分がやりたいことをコードにして配置する

必要なのはこれだけです

21 of 32

22 of 32

パッケージのアイディアの方が大事です!

23 of 32

パッケージを自作して得られたもの④

Composer は大体何でも出来る

24 of 32

イベントをフックしてシェルを動かせる

パッケージをインストールする前に発火するイベント

パッケージをインストールした後に発火するイベント

パッケージを更新する前に発火するイベント

パッケージを更新した後に発火するイベント

etc

全部で25種類くらいあります

25 of 32

パッケージを自作して得られたもの⑤

illuminate のコードを読むようになる

26 of 32

Laravel 用拡張機能を作成する場合ですが

拡張したい機能の illuminate

リクエストであれば FormRequest クラス

クエリビルダであれば QueryBuilder, Eloquent クラス

その内部を程度理解出来ていないと、そのクラスを拡張する拡張機能は作れません

拡張機能作ってなかったらそういう習慣も作れなかったかなと思います

27 of 32

パッケージを自作して得られたもの⑥

GitHub Actions を利用した

継続的インテグレーション(CI)の知識

28 of 32

自己肯定感の話でもちょっとだけ触れましたが

「実際に利用していただいている方が実際に居る」というのが目で見て分かると

やる気が出てメンテが捗ります。そして次のステップとして

「バグを出さないようにしないとな…」

「使っていただいている方が github のコード見て幻滅しないようにしないと…」

という欲が生まれてきます

29 of 32

Public リポジトリでは完全無料の GitHub Actions

お金のことなど一切気にせずにガンガン動かせます

microsoft さん、ありがとうございます

30 of 32

GitHub Actions でやったこと

  • 自動ユニットテスト
  • PHPStan によるコード静的解析
  • Deptrac による依存関係チェック
  • PHPMDによるコードの複雑さチェック
  • ReviewDog による自動レビュー
  • slack にレビュー依頼通知

など

31 of 32

Qiita の記事

PHP以外の拡張機能の記事も書いてます

https://qiita.com/kazumacchi

Laravel の Eloquent 拡張機能を作った

https://qiita.com/kazumacchi/items/419572996b423c429d70

Laravel の FormRequest にアクセサ機能を追加するパッケージを作りました (バージョン2)

https://qiita.com/kazumacchi/items/4e44a977ef494caecfb3

32 of 32

ご清聴ありがとうございました!