Composer パッケージを
自作してみて得られたもの
2023/09/16 PHPカンファレンス沖縄2023
ながまかずま
自己紹介
長間 嘉津馬(ながま かずま)
20年くらいのエンジニア歴で、その8割以上はPHPエンジニアしています
※ 若い方ご存知ないかもしれないですが、Ethna という日本製PHPフレームワークが出た頃から
■ 現在の所属
株式会社SEEC 沖縄営業所 旅行事業部
■ 今興味あること
レガシーなシステムをメンテすることが多いので、最近はレガシーコードを安全に改修・バージョンアップする手法について学習してます
弊社 渡慶次部長 撮影
今回のお話について
パッケージを自作してみて、いくつか得られたものがありました
この話で、誰かしら「自分も何か作ってみようかな…?」という気持ちになってもらえたら嬉しいな、と思っています!
※パッケージの作成方法などについての話はありません…!!すみません
パッケージを自作して得られたもの①
自己肯定感
去年のPHPカンファレンス沖縄2022で
自作パッケージを作った話をさせていただきました
Packagist を見ると、昨日時点で3200超と意外と使っていただいてます
自分が作った物を継続して利用してくれている人がいる
というのが数字で見えると、自己肯定感上がります!
当然やる気が出ますので、バージョンアップもめっちゃやりました。
先月 PHP9 にも対応済です
※PHP9 では動的プロパティ生成が禁止されるため
動的プロパティ生成をやめてマジックメソッドを経由するように改修
スライドの最後に Qiita の記事リンク貼ってますので、ご興味ありましたら是非使ってみて下さい
パッケージを自作して得られたもの②
メンタルが強くなる
意外に使っていただけたことで調子に乗った僕は
という拡張機能(kanagama/eloquent-method-expansion)を作成
QueryBuilder | Eloquent のメソッド名でカラム名と演算子を指定できる
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;
引数が空の場合、そのメソッドを省略してメソッドチェーンが可能
管理画面の一覧ページでは、絞り込み条件が多いと思います
// 名字が指定されている
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 文分岐で絞り込み
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'
9ヶ月でインストール数 37
スライドの最後に Qiita の記事リンク貼ってますので、ご興味ありましたら是非使ってみて下さい
自分で作ったモノは「素晴らしい」モノだと感じてしまうことを
心理学では家具大手IKEAさんに例えて「イケア効果」というらしいです
その効果のせいなのか、需要が全然なくても
「みんな分かっていないなぁ…こんなに良いものを…」ってなります
メンタル強くなります
パッケージを自作して得られたもの③
パッケージ自作は意外と簡単
パッケージ公開に最低限必要なディレクトリとファイル
src/ パッケージ本体
composer.json パッケージ設定ファイル
LICENSE ライセンス情報
README.md パッケージ取り扱い説明書
Composer パッケージ自作に技術はあまり必要なし
質の高いコードと高い技術を使ったパッケージは既に優秀な先人達が作ってます
必要なのはこれだけです
パッケージのアイディアの方が大事です!
パッケージを自作して得られたもの④
Composer は大体何でも出来る
イベントをフックしてシェルを動かせる
パッケージをインストールする前に発火するイベント
パッケージをインストールした後に発火するイベント
パッケージを更新する前に発火するイベント
パッケージを更新した後に発火するイベント
etc
全部で25種類くらいあります
パッケージを自作して得られたもの⑤
illuminate のコードを読むようになる
Laravel 用拡張機能を作成する場合ですが
拡張したい機能の illuminate
リクエストであれば FormRequest クラス
クエリビルダであれば QueryBuilder, Eloquent クラス
その内部を程度理解出来ていないと、そのクラスを拡張する拡張機能は作れません
拡張機能作ってなかったらそういう習慣も作れなかったかなと思います
パッケージを自作して得られたもの⑥
GitHub Actions を利用した
継続的インテグレーション(CI)の知識
自己肯定感の話でもちょっとだけ触れましたが
「実際に利用していただいている方が実際に居る」というのが目で見て分かると
やる気が出てメンテが捗ります。そして次のステップとして
「バグを出さないようにしないとな…」
「使っていただいている方が github のコード見て幻滅しないようにしないと…」
という欲が生まれてきます
Public リポジトリでは完全無料の GitHub Actions
お金のことなど一切気にせずにガンガン動かせます
microsoft さん、ありがとうございます
GitHub Actions でやったこと
など
Qiita の記事
PHP以外の拡張機能の記事も書いてます
Laravel の Eloquent 拡張機能を作った
https://qiita.com/kazumacchi/items/419572996b423c429d70
Laravel の FormRequest にアクセサ機能を追加するパッケージを作りました (バージョン2)
ご清聴ありがとうございました!