Page 1
パッケージを作ろう! LT
Create your PHP library/package!
2017-05-22 PHP BLT #7
公開日:
by USAMI Kenta@tadsan
に東京都港区六本木の株式会社メルカリ(六本木ヒルズ森タワー18F)で開催された『PHP BLT #7』でライトニングトーク(5分)として発表しました。
Create your PHP library/package!
2017-05-22 PHP BLT #7
コアの部分をぐにゃっとできるように悩んでるよ
Mastodonたのしいんですよ
PHPからMastodonのAPIを簡単に触れるクラスを作った
$composer require zonuexe/mastodon-api
コンポーザーを手元に入れる方法はキータに書いた
パッケージ作るときに決めること
パッケージ名 (vendor/package)
対象PHPバージョン
ディレクトリ構成
ライセンス
パッケージ名はvendor/package 形式([-0-9a-z]+ -と数字小文字のみ)
GitHubと一致させておくと親切
zonuexe/mastodon-api にした
どこから対応するか? HHVMは?
5.3.2+ (Composer最低)
5.5+ (旧安定版、サポート終了済み)
7.0+ (旧安定版)
5.6+, 7.1+ (現安定版)
拘りがなければsrc/とtests/に置くgit init; mkdir src/ tests/;
コマンドを配布したければ bin/ に
docs/ にドキュメントを置くと、GitHub Pagesに展開できて便利
モダンなPHPにrequireは最低限
各クラスにincludeとか書かない
composer.jsonに設定を書く
起動スクリプトでだけautoload.phpを読み込むようにする
{"autoload": {"psr-4": {"Mastodon\\": "src/"}},autoload-dev": {"psr-4": {"Mastodon\\": "tests/"}}}
{"autoload": {"files": ["src/functions.php"]},"autoload-dev": {"files": ["tests/helpers.php"]}}
{"autoload": {"classmap": ["src/"]},"autoload-dev": {"classmap": ["tests/"]}}
二次利用させるためのガイドライン
好き勝手に利用させたいならApache-2.0かMITがオススメ
他人が行なった変更を合法的に自分にも取り込みたいならGPL-3.0
ライセンス(利用許諾)を明示せずにソースコードをパブリックな場所に置いてはいけない
そのソースコードを見付けたひとが合法的に再利用することができない
よしこれで準備が整った
https://github.com/ziadoz/awesome-php
https://packagist.org/
composer.jsonのrequireは弄るな
composer requireはコマンドで。JSONファイルはいい感じに変更される
バージョンはいい感じに解決される
$ composer require guzzlehttp/guzzle respect/validation$ composer require --dev phpunit/phpunit:^4.8
SDKがやること
HTTPリクエストする
それをPHPにマッピングする
複雑さを隠すための工夫をする
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('トゥートゥー'));
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)
);}
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^)\
