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

公開日:

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

オートローディング

require

モダンなPHPに は最低限

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.0MITがオススメ

他人が行なった変更を合法的に
自分にも取り込みたいなら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^)\