Skip to content

PHPパッケージを作ろう! Lightning

公開日:

東京都港区六本木株式会社メルカリ(六本木ヒルズ森タワー18F)で開催された『PHP BLT #7』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

パッケージを作ろう! LT

Create your PHP library/package!

2017-05-22 PHP BLT #7

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id:zonuexe
  • ピクシブ株式会社でひたすらPHPやってる p(ixi)v
  • フレームワークなき道にフレームを作るおしごと
  • 最近やってること
  • ひたすらに要らないコードを整理したり、

コアの部分をぐにゃっとできるように悩んでるよ

  • Mastodon API Client/SDK作ったよ

Page 3

Mastodonたのしいんですよ

Page 4

PHPからMastodonのAPIを簡単に触れるクラスを作った

Page 5

$composer require zonuexe/mastodon-api

Page 6

コンポーザーを手元に入れる方法はキータに書いた

Page 7

パッケージ作るときに決めること

パッケージ名 (vendor/package)

対象PHPバージョン

ディレクトリ構成

ライセンス

Page 8

パッケージ名

パッケージ名はvendor/package 形式([-0-9a-z]+ -と数字小文字のみ)

GitHubと一致させておくと親切

zonuexe/mastodon-api にした

Page 9

対象PHPバージョン

どこから対応するか? HHVMは?

5.3.2+ (Composer最低)

5.5+ (旧安定版、サポート終了済み)

7.0+ (旧安定版)

5.6+, 7.1+ (現安定版)

Page 10

ディレクトリ構成

拘りがなければsrc/とtests/に置くgit init; mkdir src/ tests/;

コマンドを配布したければ bin/ に

docs/ にドキュメントを置くと、GitHub Pagesに展開できて便利

Page 11

オートローディング

モダンなPHPにrequireは最低限

各クラスにincludeとか書かない

composer.jsonに設定を書く

起動スクリプトでだけautoload.phpを読み込むようにする

Page 12

オートローディング(PSR-4)

{"autoload": {"psr-4": {"Mastodon\\": "src/"}},autoload-dev": {"psr-4": {"Mastodon\\": "tests/"}}}

Page 13

オートローディング(files)

クラスは遅延ロードできるが、

関数はできないので読み込む

{"autoload": {"files": ["src/functions.php"]},"autoload-dev": {"files": ["tests/helpers.php"]}}

Page 14

オートローディング(classmap)

名前空間とディレクトリ構成が

一致しない雑なPHPも力強く読める

{"autoload": {"classmap": ["src/"]},"autoload-dev": {"classmap": ["tests/"]}}

Page 15

ライセンス (利用許諾)

二次利用させるためのガイドライン

好き勝手に利用させたいならApache-2.0かMITがオススメ

他人が行なった変更を合法的に自分にも取り込みたいならGPL-3.0

Page 16

極論

ライセンス(利用許諾)を明示せずにソースコードをパブリックな場所に置いてはいけない

そのソースコードを見付けたひとが合法的に再利用することができない

Page 17

よしこれで準備が整った

Page 18

パッケージを探す

定番パッケージはawesome-php

https://github.com/ziadoz/awesome-php

Packagistでぐぐる

https://packagist.org/

Page 19

鉄則

composer.jsonのrequireは弄るな

composer requireはコマンドで。JSONファイルはいい感じに変更される

バージョンはいい感じに解決される

$ composer require guzzlehttp/guzzle respect/validation$ composer require --dev phpunit/phpunit:^4.8

Page 20

SDKがやること

Page 21

SDKのおしごと

HTTPリクエストする

それをPHPにマッピングする

複雑さを隠すための工夫をする

Page 22

Entity

Mastodon本家のAPIリファレンスを

ひたすらひたすらひたすら写してく

https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#entities

自作のライブラリで型付け

https://github.com/BaguettePHP/objectsystem

Page 23

あんまり複雑なことを見せない

ちょーかんたんっぽく

<?php use Baguette\Mastodon as m;$mastodon = m\session(

'pawoo.net', $client_id, $client_secret, [

'scope' => 'read write follow',

'grant' => ['username' => $mail, 'password' => $passwd],]);$account = $mastodon->getAccount(42);$mastodon->postStatus(m\toot('トゥートゥー'));

Page 24

OOPであることには拘らない

Requestするメソッド

public static function getAccount(Client $client, SessionStorage $session, $id) {v::intVal()->min(0)->assert($id);return static::map(Entity\Account::class,$client->requestAPI('GET',

sprintf('/api/v1/accounts/%d', $id), [], $session)

);}

Page 25

中では再帰的にクラスを生成

APIの結果をデコードしてぶっこむ

public function __construct(array $properties) {$this->setProperties(mapValues($properties, ['account' => Account::class,'reblog' => Status::class,'created_at' => \DateTimeImmutable::class,'media_attachments' => [Attachment::class],'mentions' => [Mention::class],'tags' => [Tag::class],'application' => Application::class,]));}

Page 26

テストの書きかた

Page 27

テスト

がんばりすぎない

踏み外したくない道をしっかり書く

HTTPリクエストはGuzzleで隠蔽

Page 28

Mastodonたのしいんですよ

Page 29

まだ未実装なAPIはたくさん/(^o^)\