Help us understand the problem. What is going on with this article?

Slim(PHP Framework)事始め(2)

More than 3 years have passed since last update.

あらまし

配属先でSlimを使っているので、使い方などをメモしている。
前回

コマンドが動作しない事がある

前回書き忘れていましたが、

$ composer test

等としても動作しない事がありました。
調べてみると、vendor/bin/phpunit辺りの改行コードがCRLFだったりしたのが原因っぽいです

Windows上でVagrantを利用している環境でしたので、gitのautoCRLFが有効になっていた為に切り替え時におかしくなったのかと思います

PHP CodeSnifferの導入

composerを導入してあれば

$ composer require --dev squizlabs/php_codesniffer

こんな感じで。
余談ですが、インストールしたいライブラリの名前の一部分だけを知っている場合、

$ composer search codesniffer
〜
opus4-repo/codesniffer Coding style for OPUS 4
cakephp/cakephp-codesniffer CakePHP CodeSniffer Standards
escapestudios/symfony2-coding-standard CodeSniffer ruleset for the Symfony2 coding standard
〜

こんな感じで検索出来ます
「フレームワーク向けにカスタマイズするのが面倒」などのような時も、例えばcakephp/cakephp-codesnifferなどがあるように、誰かしら作っている可能性があるので、確かめてみるのはおすすめです

とりあえず今回は調べてみてもSlim用の規約があるようでは無いので、こんな感じで設定しました

composer.json
    "scripts": {
        "start": "php -S 0.0.0.0:8080 -t public public/index.php",
        "test": "phpunit",
        "phpcs": "phpcs --standard=PSR2 src/",
        "phpmd": "phpmd src/ text cleancode,codesize,design,unusedcode"
    }

PHP dotenvの導入

勉強用にちょっと試しているだけならともかく、大抵の場合は開発環境、ステージング環境、本番環境と設定を分ける必要があるかと思います
そんな時に便利なのがPHP dotenvです
このライブラリは、指定したディレクトリにある.envファイルの内容を、環境変数として取り込みます

まずはインストール

$ composer require vlucas/phpdotenv

ライブラリ読み込み部分

public/index.php
12 require __DIR__ . '/../vendor/autoload.php';
13
14 // find environment file
15 $dot_env = __DIR__. '/../.env';
16 if (is_readable($dot_env)) {
17     $dotenv = new Dotenv\Dotenv(__DIR__. '/../');
18     $dotenv->load();
19 }
20
21 session_start();

試しにDEBUGという変数と、エラー表示をセットしてみる

.env
DEBUG=1
DISPLAY_ERROR=1

設定で使用

src/settings.php
01 <?php
02 return [
03     'settings' => [
04         'debug' => getenv('DEBUG'),
05         'displayErrorDetails' => getenv('DISPLAY_ERROR'), // set to false in production
...

他、プロジェクトをクローンしてきた時に「どのような環境変数を設定するのか?」が分からなくなりがちなので、_envというファイルでも作っておいて、各々作業に入る前に.envにコピーして〜というルールを決めておくといいかと思います

_env
# for production environment
DEBUG=0
DISPLAY_ERROR=0
.gitignore
/.env

whoops!導入

whoops!は、「シマッタ!」みたいな意味でしょうか?
とりあえず、このライブラリでは「シマッタ!」時のエラー表示を詳しくしてくれます

今回試してみた感じだと、フレームワーク側でob_startしている箇所があり、それが原因なのかうまく表示出来ないケースがあったので、Slim用のwhoopsを導入してみます

$ composer require --dev dopesong/slim-whoops
src/dependencies.php
04 $container = $app->getContainer();
05
06 // 上の.envでDEBUG=1の時にデバッグ機能をオンにする
07 if ($container->get('settings')['debug']) {
08    // ob_start前のエラーをハンドルする
09    $whoops = new Whoops\Run;
10    $whoops->pushHandler(new Whoops\Handler\PrettyPageHandler);
11    $whoops->register();
12    // ob_start以降のエラーをハンドルする
13    $container['phpErrorHandler'] = $container['errorHandler'] = function($c) {
14        return new Dopesong\Slim\Error\Whoops($c->get('settings')['displayErrorDetails']);
15    };
16 }

デバッグバーの導入

デバッグバーは、フルスタックのフレームワークではよく見かけるのですが、実行時間や環境変数などの情報やエラーなど、本来サーバ側のログを見ないと分からないような情報をブラウザ側で表示してくれるツールです

PHP用で有名なものの他に、それぞれのフレームワーク用実装があるのですが、今回はこちらをインストールしてみます

$ composer require --debug kitchenu/slim-debugbar
src/dependencies.php
12    // ob_start以降のエラーをハンドルする
13    $container['phpErrorHandler']/* = $container['errorHandler']*/ = function($c) {
14        return new Dopesong\Slim\Error\Whoops($c->get('settings')['displayErrorDetails']);
15    };
16
17    // debugbar setting
18    $settings = $container->get('settings')['debugbar'];
19    $provider = new Kitchenu\Debugbar\ServiceProvider($settings);
20    $provider->register($app);
21 }

今回、$container['errorHandler']をコメントアウトしているのは、デバッグバーの方でslimのexceptionを読み込むようになっているのですが、そのエラーがwhoopsの方で処理しようとしてエラーが起こる為です

src/settings.php
01 <?php
02 return [
03     'settings' => [
04         'debug' => getenv('DEBUG'),
06         // debug bar
07         'debugbar' => [
08             'storage' => [
09                 'enabled' => true,
10                 'path' => __DIR__. '/../logs/debug/',
11             ],
12         ],
...

この設定をしておくと、過去のリクエストの情報を保存しておいて、デバッグバーの方から参照出来るようになります
OAuthのライブラリなどでは、ライブラリ内でリダイレクトをするようなものもあり、それに気づかないでいると「あれ?どうしてこんな動作するんだ?」という事になりますが、そのような挙動も記録しておいてくれるので便利です

感想

色々と便利なライブラリがあるので、導入すると便利に開発していけるかと思いますが、ひとつひとつ検証していくのは相当骨が折れます。。。
やはりフルスタックのフレームワークは便利ですね

後はORMで手頃なライブラリがあればいいかと思うのですが、doctrineだと大げさな気はしますし、他の小さなライブラリなんかはサポートなんかが不安で難しいところです

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした