忍者ブログ

STEP UP BLOG

Home > ブログ > Laravel

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Laravelの開発環境でカスタムエラーページを表示させないために

Laravel 5.2対象。
Laravel 5.2では、
resources/views/errors
以下に
resources/views/errors/404.blade.php
resources/views/errors/500.blade.php
のようにHTTPステータスコードのビューファイルを置くことで、独自のエラーページを表示させることができます(ステータスコードでなくてもできますが)。
しかし、開発環境では小綺麗なエラーページでなく、どんなエラーがどこで起きたか知りたいのが常。
というわけで本番環境ではないときに、カスタムエラーページではなくLaravelのエラースタックトレース画面を表示させるにはどうすればいいか。
Laravel 5.2でのエラーハンドリングは、
app/Exceptions/Handler.php のHandlerクラスが取り扱っています。
このクラスはExceptionHandlerクラスを継承していて、ExceptionHandlerクラスにはrenderHttpExceptionメソッドといういかにもそれっぽいメソッドがあります。
このrenderHttpExceptionメソッドがカスタムエラーページを描画しています。
そこでrenderHttpExceptionメソッドをHandlerクラスでオーバーライドしましょう。
/**
 * Render the given HttpException.
 *
 * @param  \Symfony\Component\HttpKernel\Exception\HttpException  $e
 * @return \Symfony\Component\HttpFoundation\Response
 */
protected function renderHttpException(HttpException $e)
{
    if (!App::environment('production')) {
        return $this->convertExceptionToResponse($e);
    }

    return parent::renderHttpException($e);
}

上記をHandler.php内に記述すれば、本番環境以外でカスタムエラーページが表示されなくなります。
という感じで快適なLaravelライフを(^人^)
PR

LaravelにおけるEager Loading

LaravelはRuby on Railsの思想を強く受け継いでいるPHPフレームワークです。
したがって、DBからのデータ取得もRailsのActiveRecordのような強力なORマッパーが用意されています。
それがEloquentです(エロクワントと読むらしい…)。
もちろん、1対1や1対多の関連付けも対応しています。
例えば、
class Train extends Eloquent {
    public function stations()
    {
        return $this->hasMany('Station', 'train_id', 'id');
    }
}
こんな感じで路線と駅が1対多で関連付けられます。
こう設定すると、
$trains = Train::all();
foreach ($trains as $train) {
    foreach ($train->stations as $station) {
        echo $station->name."¥n";
    }
}
とか出来ます。
しかもデータが必要になるタイミングでSQLが発行されるので、
無駄なSQLが発行されません。

ただし!!
このように便利なORマッパーにも問題がありまして、
その中でも重大なものが「N+1問題」というものです。
この問題は、1対多などの場合で、最初に親を取ってきて、
ループで関連付けられている子のデータを1つずつ取ってくる、
結果としてN+1回SQLが発行される問題です。
「N+1問題」で検索するとわかると思いますが、これはORマッパーの遅延ローディングでは仕方のないことです。

ですがそこはそれ、Railsの先人達はとっくの昔に気付いており対策が施されています。
それがEager Loadingという概念です。
これだと子をまとめて1回のSQLで取ってきてしまいます。
つまり、SQL発行回数がN+1回から2回になり激減。みんな笑顔^^

同様にLaravelでもEager Loadingが取り入れられています。

http://laravel.com/docs/4.2/eloquent#eager-loading

Laravelでは、
$trains = Train::with('stations')->all();
のようにwith()に設定した関連付けを渡すことで、子もまとめて取得してくれます。
1対多でループしている場合、with()を使うと使わないとではSQL発行回数が桁違いに異なってくるので、
是非とも使用していきたい機能です。

そして、これは例えば孫がある場合も使えます。
駅Stationに駅員Memberが関連付けられているとすると、
$trains = Train::with(['stations', 'stations.members'])->all();
のようにピリオドでどんどん深い関連付けまでまとめて取得してくれます。

ORマッパーは適切に使うとビジネスロジックを直感的に扱うことが出来るので便利です。
つまり、ビジネスロジックをSQLに落としこむ苦労が軽減されます。
ORマッパーの発行するSQLに関しても、Eager Loadingなどを使い適切な実装をすればそこまで効率が悪くなることもありません。
その点に意識的になると、Laravelレベルがまたひとつ上がるのかなと思います。

Laravelでのデバッグツールlaravel-debugbarが使えすぎる

先日、外部から講師を招いて社内Laravel勉強会が開かれました。
どちらかというと初心者向けのチュートリアルで、
知っていることが多かったのですが、
その中でひとつ、これは便利だなというツールがありました。

laravel-debugbar
https://github.com/barryvdh/laravel-debugbar

というLaravelのデバッグツールです。
これを使用すると、ブラウザ上でログや発行されたSQL、ルーティングや呼ばれているビューなどが閲覧出来ます。
便利すぎる。。

こんな便利なツールは使わない手はない! ということで、まずはインストールです。
composer.jsonのrequireに以下の1行を追加。
"barryvdh/laravel-debugbar": "1.*"

そしてcomposer updateします。
次にapp/config/app.phpに以下の2つを追加。
providers配列に
'Barryvdh\Debugbar\ServiceProvider',

aliases配列に
'Debugbar' => 'Barryvdh\Debugbar\Facade',

最後にdebugbar用の書き込みディレクトリを用意。
$ mkdir app/storage/debugbar
$ chmod 777 app/storage/debugbar

これで開発しているサイトにアクセスしてみると、、、
一番下にデバッグバーが表示されます!!!
開発しながら知りたい情報ばかりで、かゆいところにしっかりと手が届くデバッグツールです。
Laravelで開発する上で非常に便利なツールだと思うので是非使ってみてはいかがでしょうか。

Laravelの便利関数

以下にまとめられています。
http://laravel.com/docs/4.2/helpers

その中からいくつか気になったのを紹介。
・str_limit
str_limit($value, $limit = 100, $end = '…')
指定した文字数以上だと三点リーダなどの文字を追加して返してくれます。

・str_random
$string = str_random(40);
ランダム文字列を返します。

・dd
dd($value);
ダンプして実行を止めます。

・with
$value = with(new Foo)->doWork();
オブジェクトを返してくれます。メソッドチェーンしたいときに便利です。

他にも便利な関数がたくさんあるのでよかったら調べてみてはどうでしょうか〜。

Laravel Tokyo Camp Vol.1に参加してきました

参加してきました。
http://laravelers.doorkeeper.jp/events/17055

・Laravel 5.0 イントロダクション
 ・資料リンク
http://www.slideshare.net/fumiofurukawa/laravel5-introduction-20141120

 ・Laravelの最新情報はLaracastsを見るべし。
https://laracasts.com/

今回のLaravel5のセッションは以下のリンク先を元に発表されました。
https://laracasts.com/series/whats-new-in-laravel-5

その中でも聞いていてこれは! と思ったものをいくつか以下に書いていきます。

 ・PHP名前空間の強制
名前空間が必須となります。
そのおかげでファサードが気楽に使えなくなります。
ファサードとはどこでもクラスを呼べる機能のことです。
$row = User::find(1);


こんな感じの。
Laravelの機能で何が便利か、1つ挙げるとしたらファサードを私は挙げるのですが、
それが使えなくなるかもというのはかなり実装の仕方が変わってくるはずです。

・メソッドインジェクション
今までインジェクションはコンストラクタでしか使うことが出来ませんでした。
class UserController extends BaseController {
    public function __construct(User $user)
    {
        parent::__construct();

        $this->model = $user;
    }


それがメソッドでもインジェクション出来るようになります。
class UserController extends BaseController {
    public function hoge(User $user)
    {
        $user->foo()
    }


これによってインジェクションの細かな制御が出来るようになって、無駄なインジェクションが無くなるのではと思っています。

 ・ルートアノテーション
Laravelのルーティングは基本的にapp/routes.phpに記述します。
Laravel5からはそのルーティングがコントローラにも書けるようになるそうです。
なんかJavaっぽいですね。
http://mattstauffer.co/blog/laravel-5.0-route-annotations


リリースはまだまだ先、2015年1月以降と予想されています。
もう別のフレームワークと言っていいほどがっつり変わるので、4から5への移行には結構な決断が必要ですね。。


その他のセッションも興味深いものばかりでした。
みなさんレガシーコードに困っているのですね。。
自社以外の開発の本音を聞けると、自分のところも! みたいな感じでモチベーションが上がります。
懇親会まで参加していろいろ有意義な情報交換をすることが出来ました。
このような場を設けてくださった主催者に感謝しきりです。
また機会があれば行きたいですね。

PAGE TOP