がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

Slim docsの解析; System Error Handler

https://www.slimframework.com/docs/v3/handlers/error.html
地味に大事なあたり。


Default error handler
「デフォルトのエラーハンドラは非常に基本的です。 Responseステータスコードを500に設定し、Responseコンテンツタイプをtext / htmlに設定し、Response本体に汎用エラーメッセージを追加します。
 これは、実稼動アプリケーションにはおそらく適切ではありません。 独自のSlimアプリケーションエラーハンドラを実装することを強くお勧めします。(機械翻訳)」。
うん身もふたもないw


「デフォルトのエラーハンドラには、詳細なエラー診断情報を含めることもできます。 これを有効にするには、displayErrorDetails設定をtrueに設定する必要があります。(機械翻訳)」ふむり。
これはデフォでtrueにしておいてもよいのやもしれぬ。


Custom error handler
ふむ……先に余談。
「A Slim Framework application's error handler is a Pimple service.」……Pimple service?
https://pimple.symfony.com/
これ、か。へぇ。
なんか「えらいことシンプルでお好み」だと思ったんだが、ここだけ切り出されてるのか。興味深い。


んで、本題。
「There are two ways to inject handlers:」ほぉ。

$c = new \Slim\Container();
$c['errorHandler'] = function ($c) {
    return function ($request, $response, $exception) use ($c) {
        return $c['response']->withStatus(500)
                             ->withHeader('Content-Type', 'text/html')
                             ->write('Something went wrong!');
    };
};
$app = new \Slim\App($c);
$app = new \Slim\App();
$c = $app->getContainer();
$c['errorHandler'] = function ($c) {
    return function ($request, $response, $exception) use ($c) {
        return $c['response']->withStatus(500)
                             ->withHeader('Content-Type', 'text/html')
                             ->write('Something went wrong!');
    };
};

あんま変わらんw
どっちかってぇと。writeのところのコンテンツを「テンプレートエンジン側で用意した、デフォルトのテンプレートにすり替える」とか、なんだろうなぁ。実際の実装時は。


Class-based error handler
うんまぁこれも。ようは「無名関数返す」か「__invoke()が実装されたクラスインスタンスを返すか」なので、中身的にはあんまり変わらん。


Handling other errors
ふむ……ようは
・notAllowedHandler https://www.slimframework.com/docs/v3/handlers/not-allowed.html :ルーティングで、URIはあったけどmethodがマッチしなかったよ!
・notFoundHandler https://www.slimframework.com/docs/v3/handlers/not-found.html :ルーティングにマッチしなかったよ!
・phpErrorHandler https://www.slimframework.com/docs/v3/handlers/php-error.html :PHP7以降のランタイムエラー
・SlimExceptionは補足できないよ
・上述以外は errorHandler
って感じだねぇ。


Disabling
やらないと思うw


ふむ、シンプルに片付いた。
まぁとりあえず「errorHandlerはmust & 念のために"本番用"もちゃんと用意しよう」ってのと。
それ以外については「ざっくりと"本番用"を用意」しておくとよい、のかなぁ。
まぁ場所は把握できたので、あとは必要に応じて。