f:id:takuseno:20160925120317j:plain

Webでフレームワークを使おうと思うとRuby on Railsほど優れているものはないかと思いますが、僕はアルバイト先でPHPのフレームワークであるLaravelを使って開発しています。

laravel.com

昔はCakePHPが多かったと思いますが、Googleトレンドを見てもLaravelがだいぶ増えてきているのがわかります。(というかPHP離れが進んでいるだけかも?)

そこで今回は、Laravelを開発するときにソースコードを見るといいよという話をします。

Laravelのドキュメント

Laravelのドキュメントは結構充実していて、全体の機能をわかりやすく説明されています。

laravel.com

最初に開発を始めるときはここを見ておけば問題なく開発を進めることができます。ただ関数ごとに返り値は何かとか、内部的な処理の説明はないので、もっと進んだアプリケーションを作ろうと思うとAPIドキュメントを見る必要があります。

Namespaces | Laravel API

このAPIドキュメントを読めば大体のことがわかるのですが、実はLaravelのソースは結構綺麗に描かれていて、このドキュメントを読むよりソースを読んだ方が実際の処理もわかるので僕はいつもソースを読んでいます。

ソースコードを読む

LaravelのGItHubのリポジトリはlaravel/laravelなのですが、実際のフレームワークを構成しているコードたちはこちらになります。

github.com

このリポジトリのsrc/Illuminate以下が実装になります。例えば、EloquentORMを使っているときに、firstOrNewfirstOrCreateが実際にどのように違うのか気になったとします。そんなときはsrc/Illuminate/Database/Eloquent/Builder.phpを見に行きます。 すると簡単に両関数を見つけることができます。

    /**
     * Get the first record matching the attributes or instantiate it.
     *
     * @param  array  $attributes
     * @return IlluminateDatabaseEloquentModel
     */
    public function firstOrNew(array $attributes)
    {
        if (! is_null($instance = $this->where($attributes)->first())) {
            return $instance;
        }
        return $this->model->newInstance($attributes);
    }

    /**
     * Get the first record matching the attributes or create it.
     *
     * @param  array  $attributes
     * @param  array  $values
     * @return IlluminateDatabaseEloquentModel
     */
    public function firstOrCreate(array $attributes, array $values = [])
    {
        if (! is_null($instance = $this->where($attributes)->first())) {
            return $instance;
        }
        $instance = $this->model->newInstance($attributes + $values);
        $instance->save();
        return $instance;
    }

すると実際には$instance->save()をしているかしていないかだけが違うことがわかります。Laravelの関数一つ一つのコードはこのくらい短く、Railsに比べるとコードを追うのがかなり楽です。 ドキュメントを見にくよりも毎回このようにソースを見ていった方が関数の仕様と中でどんな処理をしているのかをつかむことができるのでかなりオススメです。

まとめ

文系プログラマの方はライブラリがあったときに、中を読まずになんとなく便利だなと思いながら使っている人が大半だと思いますが、それではドキュメントに載っていないようなところでつまずいたときに解決できなくなってしまいます。また、ライブラリのソースを読むことでそのライブラリにプルリクを投げる機会がやって来るかもしれません。近いうちにLaravelにプルリクを投げようかと思います。

Laravelのコードは読みやすいのでぜひ皆さんも開発しながらコードを眺めて見てください。