2016-01-03
■[php] PHP7 で PSR-7 と Middleware を使うマイクロフレームワークを書いてみた
コードはこちら。https://github.com/brtriver/karen
なにこれ?
PSR-7が用意されてからコンポーネントを色々好きなのを選択できる時代が来つつあります。
たとえばzend-expressiveとか。
ただフレームワークががんばってこれらを抽象化しようとしてるのですが、もっとシンプルでもいいなぁと。
というわけで、コンポーネントをむき出しにして、ざぁーっと書いたらどうなるかをヤッてみたかったので書いただけという。
結果こんな感じに
https://github.com/brtriver/karen/blob/master/web/index.php
試してみたい人は
php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" php composer.phar create-project brtriver/karen --stability=dev ./<パス> cd <パス> make server // http://localhost:8888/hello/karen_girls
で。
Karenでやったこと
PSR-7 とMiddleware は自由に差し替えられるように
逆にいうと、サービスコンテナ(DI)、ルーティングはフレームワークとして蜜になっててもいいかなと。
フレームワークのコントローラーは薄く
ルーティングのクロージャーで少し書きやすくするためのControllerクラスとTemplatableトレイトだけを用意。
「こういう処理をやる」ということをラベル(コメント)ブロック付けた
スコープが閉じられるわけじゃないです。あくまでもラベル。
ただインラインコメントを残すよりもわかりやすかなと。
<?php container: { $c = new Container(); .... } middleware: { $relayBuilder = new RelayBuilder(); ... }
さすがにサービスコンテナ無いと辛そう
コンテナは Container Interop というのも用意されてたりしますが、まだ公式というほどでもないのと、好きなの使えばいいじゃんということで使い慣れた Pimpleを選択。
別のコンテナ使ったとしても、Karen程度のフレームワークであればそんなに書き換えるのは大変じゃないと思う。
ルーティングは Aura.router
ルーティングはクロージャーが定義できればいいので、使ったことがある Aura.routerで
<?php ... $map->get('hello', '/hello/{name}', function($args, $controller) { $name = $args['name']?? 'karen'; return $controller->render('Hello, ' . $name); })->tokens(['name' => '.*']);
PHP7だと issetじゃなくて "??" 使えるの便利ですね。
KarenではControllerクラスを用意して、便利関数やRequest, Responseオブジェクトにクロージャーからアクセス出来るようにしてあります。
コントローラークラスの拡張を無名クラスでもできるように
必要があればControllerをextendsした専用のコントローラーを用意すればいいのですが、PHP7で無名クラス使えるので無名クラスでControllerを拡張できるようにしてみました。
たとえば通常は
<?php ... $c['controller'] = function($c) { return new Controller($c['request'], $['response']); };
と、コントローラーの用意しますが、
Templatable トレイトを利用できるようにしたControllerを用意したい場合は
<?php ... $c['controller'] = function($c) { $controller = new class($c['request'], $c['response']) extends Controller{ use Templatable; }; $controller->setTemplate($c['template']); return $controller; };
Middleware は Realy で
詳しくはRealyを使ってみた。
これって知ってる人は知ってる Mojavi のアレですよね。(懐かしい
書いてみてどうだったの?
- 書くのが疲れたので、いつかのLTのネタとして。
- 12 https://t.co/7FF5nPmv4J
- 6 http://htn.to/aWK73Sf
- 4 http://b.hatena.ne.jp/
- 4 https://www.google.co.jp/
- 3 https://www.google.co.jp
- 2 http://b.hatena.ne.jp/entrylist/hatena/はてなブログ
- 2 http://b.hatena.ne.jp/red_snow/favorite
- 2 http://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CDwQFjAF&url=http://goo.gl/dE6a8S&ei=u46IVv2FJ_rCgQXvWg&usg=AFQjCNH71Zmtz7XIAW5ga5PobaTeSuVE5Q
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDEQFjAA&url=http://d.hatena.ne.jp/brtRiver/20160103/microframework_psr7_php7&ei=4I6IVvz0KqPnpQOBjQE&usg=AFQjCNFs2nUWetI7i2cvNnZyIj5V_fGhGw
- 2 http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFQQFjAA&url=http://goo.gl/dE6a8S&ei=Ao-IVseVNNWmtQGhsAE&usg=AFQjCNH71Zmtz7XIAW5ga5PobaTeSuVE5Q
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |