Laravelで ExceptionといっしょにViewを投げる
カメラを買ったものの、運動会の撮影に失敗した開発室員です。
予備バッテリーも忘れるし。何事も練習しないとダメですねぇ。
今回はLaravelのエラーハンドリングのお話にします。
アプリケーション的な例外処理
システムやフレームワークに起因するエラーや、入力バリデーションで対応するエラーではなく…今回はアプリケーション側での例外を考えてみます。
render() が膨らむ問題
例外のハンドリング、細かくやろうとすると Exceptions/Handler.php や Exceptions/HogeException.php の render() が複雑怪奇になりがちです…それをちょっとわかりやすくならないか? という。
Responsableで例外とレスポンスを関連付け
Laravel5.5 から Responsable というインタフェースが追加されています。~able
系。
ADRパターンのレスポンダで使ったりするようですが、今回はそれを使って表題の件を実装してみる。
Exceptionをつくる
AppExceptions\HogeException.php としまして…
<?php
namespace App\Exceptions;
use Illuminate\Contracts\Support\Responsable;
use Illuminate\Contracts\View\View;
use Symfony\Component\HttpFoundation\Response;
use Throwable;
use RuntimeException;
class HogeException extends RuntimeException implements Responsable
{
protected $error = 'error';
private $view;
public function __construct (
View $factory, string $message = "", int $code = 0, Throwable $previous = null )
{
// Viewを受け取って
$this->view = $factory;
parent::__construct($message, $code, $previous);
}
/**
* Responsableインタフェースの実装
*/
public function toResponse($request) : Response
{
return new Response (
// withでテンプレートに渡す
$this->view->with($this->error, $this->message)
);
}
/**
* ログも書けます
*/
public function report()
{
logger()->alert(
sprintf("%s %s [%s]",
request()->method(),
request()->path(),
$this->message
)
);
}
}
Exception投げるときは useしといて
throw new HogeException (
view($this->error_tpl), 'エラーメッセージ'
);
こんな感じで書けます。便利かも。
Laravel本のご紹介
本。まとまってるから通しで読みやすいし、いいですよね。つい買ってしまいます。
Laravelの参考に読んでる(読んでた)本のご紹介でも。
まずは上のやつ
まさに Laravel入門 って感じです。 これをとりあえず通しでやってみれば、一通りの流れや使い方が何となくわかる。実際の要件を実現するには不足かと思いますが、この本が終わるころには Laravel公式 + ネット検索で対応できる。はず。
ただし、これはPHPの入門本ではないです。PHP中級者? 向けってやつなのかな。
んじゃ次は…
まだ全部読んでないですが…この記事の更新時点では、一番新しい日本語本でしょうか?
最初に紹介した入門本よりも更に幅広く、より具体的に書いてあるので参考になります。入門本は終わったけど、もっと知りたい! なんかモヤモヤする! と思った方にちょうど良いかも。
PHPフレームワークは各種使い慣れてて、Laravelやってみるかなって人はこっちから始めてもいいのかな。あとはまぁ、リファレンス的なつまみ食いにも便利か。
Laravel本は少ないけど…
新しいものを導入する時って
- 何から手をつければいいのやら
- 周囲に聞ける人がいない
- つか、何から聞けばいいのか
- 公式だけだと良くわからなかった
- ブログや解説記事だけだと不安が
みたいな状況になったりしがち。
そんな時は、本を通しで(手を動かしながら)終わらせた方が効率的な場合も多いかな…と個人的には思います。
では、ひとまずこんなところで。