Page 1
パッケージを作ろう! LT
Create your PHP library/package!
2017-05-22 PHP BLT #7
公開日:
by USAMI Kenta @tadsan
パッケージを作ろう! LT
Create your PHP library/package!
2017-05-22 PHP BLT #7
お前誰よ
うさみけんた (@tadsan) / Zonu.EXE
ひたすらに要らないコードを整理したり、
Mastodon
たのしいんですよ
PHPからMastodonの
APIを簡単に触れる
クラスを作った
$composer require zonuexe/mastodon-api
コンポーザーを手 元に入れる方法は
キータに書いた
パッケージ作るときに決めること
vendor/package
パッケージ名 ( )
対象PHPバージョン
ディレクトリ構成
ライセンス
パッケージ名
vendor/package
パッケージ名は 形式
[-0-9a-z]+
( -と数字小文字のみ)
GitHubと一致させておくと親切
zonuexe/mastodon-api
にした
対象PHPバージョン
どこから対応するか? HHVMは?
5.3.2+
(Composer最低)
5.5+
(旧安定版、サポート終了済み)
7.0+
(旧安定版)
5.6+, 7.1+
(現安定版)
ディレクトリ構成
src/ tests/
拘りがなければ と に置く
git init; mkdir src/ tests/;
bin/
コマンドを配布したければ に
docs/
にドキュメントを置くと、
GitHub Pagesに展開できて便利
オートローディング
require
モダンなPHPに は最低限
include
各クラスに とか書かない
composer.json
に設定を書く
起動スクリプトでだけ
autoload.php
を読み込むようにする
オートローディング(PSR-4)
{
"autoload": {
"psr-4": {
"Mastodon\\": "src/"
}
},
autoload-dev": {
"psr-4": {
"Mastodon\\": "tests/"
}
}
}
オートローディング(files)
クラスは遅延ロードできるが、 関数はできないので読み込む
{
"autoload": {
"files": ["src/functions.php"]
},
"autoload-dev": {
"files": ["tests/helpers.php"]
}
}
オートローディング(classmap)
名前空間とディレクトリ構成が
一致しない雑なPHPも力強く読める
{
"autoload": {
"classmap": ["src/"]
},
"autoload-dev": {
"classmap": ["tests/"]
}
}
ライセンス
(利用許諾)
二次利用させるためのガイドライン
好き勝手に利用させたいなら Apache-2.0かMITがオススメ
他人が行なった変更を合法的に
自分にも取り込みたいならGPL-3.0
極論
(利用許諾)
ライセンス を明示せずに
ソースコードをパブリックな場所に
置いてはいけない
そのソースコードを見付けたひとが
合法的に再利用することができない
よしこれで
準備が整った
パッケージを探す
定番パッケージはawesome-php
https://github.com/ziadoz/awesome-php
Packagistでぐぐる
https://packagist.org/
鉄則
composer.json require
の は弄るな
composer require
はコマンドで。
JSONファイルはいい感じに変更される
バージョンはいい感じに解決される
$ composer require guzzlehttp/guzzle respect/validation
$ composer require --dev phpunit/phpunit:^4.8
SDKがやること
SDKのおしごと
HTTPリクエストする
それをPHPにマッピングする
複雑さを隠すための工夫をする
Entity
Mastodon本家のAPIリファレンスを
ひたすらひたすらひたすら写してく
https://github.com/tootsuite/documentation/blob/
master/Using-the-API/API.md#entities
自作のライブラリで型付け
https://github.com/BaguettePHP/objectsystem
あんまり複雑なことを見せない
ちょーかんたんっぽく
<?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('トゥートゥー'));
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)
);
}
中では再帰的にクラスを生成
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,
]));
}
テストの 書きかた
テスト
がんばりすぎない
踏み外したくない道をしっかり書く
HTTPリクエストはGuzzleで隠蔽
Mastodon
たのしいんですよ
まだ未実装なAPIは たくさん/(^o^)\