12月 142016
 

この記事は、アイスタイル Advent Calendar 2016の14日目の記事です。
今年3月入社のfagaiが担当します。よろしくお願いします。

(Laravelアドベントカレンダーにも似たような内容がある気がしなくも無いのですが気にしない。)

はじめに

弊社ではWebサービスとして複数のサービスを提供しているのですが、最近は主にLaravelを利用しています。
Laravelというフレームワークは今までの主流であったCakePHP2などと異なる特徴を持っており、初めて扱う人は少し戸惑うかもしれません。
この記事は、これからLaravelを利用しようとしている方や、現在Laravelを利用しているけどソースまでは追いきれない、日本語マニュアルに書いてあることで精一杯だという人向けの記事です。
一応、Laravel以外でもよい知見になれるような情報を載せたつもりです。

前提条件

  • LaravelのWelcomeページを表示できること
  • Linuxの知識が多少なりともあること

とかなのでしょうか。実際よくわかりません。

Laravelのソースを追えるようになるためにはどうしたら良いのか。

Laravelのソースを追えるようになるためにはどうしたら良いのかわからない人もいるかもしれません。
読もうとは思ったけど、よくわからないという人も結構いるのかなと思います。

Laravelのソースを追えるようになるのに重要な点は私は3つあると思っています。

  • IDEの基本機能を使いこなす+プラグインを使う
  • 足りていないPHPの技術知識を得る
  • デバッガーを利用する

この3つです。
一つずつ見ていきます。

IDEの基本機能を使いこなす+プラグインを使う

ide-helperを導入しましょう。

まずは、これが無いと追うのも大変です。
Laravel IDE Helperを導入しましょう。

インストール方法に関しては割愛しようと思ったのですがとりあえずサクッと説明

1.composerで導入する

$ composer require --dev barryvdh/laravel-ide-helper

2.app/Providers/AppServiceProvider.phpのregisterメソッドに以下を追加する

public function register()
{
    if ($this->app->environment() !== 'production') {
        $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
    }
    // ...
}

3.php artisan ide-helper:generateを叩く

以上。4番目にcomposer.jsonのscriptに足す作業と設定ファイルをvendor:publishで出力する必要があります。

PhpStormやNetbeansを利用しましょう。

なお、ここではPhpStormだけ説明します。

File→Settings→Plugins→Browse RepositoriesからLaravel Pluginを入れましょう。
入れて再起動したあとには
File→Settings→Languages & Frameworks→PHP→Laravelを選択して、Enable plugin for this projectにチェックを入れます。

これで一応準備完了です。
Netbeansの場合は色々指定しておかないと色々面倒だったと思うので是非phpstormに乗り換えましy

定義への移動を使おう

慣れてる人であればカーソルを飛びたいメソッドなどに合わせてCtrl+Bで飛ぶのですが、私は慣れてないのでCtrl+クリックでジャンプしています。
戻ってくるときには、Ctrl+Alt+←で大体は戻ってこれます。
EclipseとかだとF3キーに設定されてたりするらしいですね。

定義への移動

有能な検索窓を使おう

PhpStormの場合、Shiftを2回押すことで非常に便利な検索窓が出現します。
ここでは、Illuminate\Foundation\Http\Kernel.phpにアクセスしています。

検索窓

ファイル全体検索

Ctrl+Shift+Fでプロジェクト内でその言葉が含まれているファイルを検索できたりします。
Laravelの場合はインターフェースを頻繁に利用していることがあるので、その定義がどこなのかを把握するのに便利です。

ファイル全体検索

また、Laravelの場合はコア的な機能は大体Foundationの中に入っているので、ファイルがたくさんヒットしてわからないーってときはFoundationから探っていくと良いでしょう。まあ、インターフェースの場合はProviderHttp\Kernelあたりに目星をつけて探すのが安定します。
これもちゃんと読んでいってるから目星がつけれるわけですが。。。

といったところで、この3つの機能はまず使えるようになっておいたほうが良いです。

足りていないPHPの技術知識を得よう。

流石にPHP5.3で導入されている名前空間の話とかはしなくて良いですよね。
ここではほんの少し解説します。

  • PSR
  • Reflection

PSR

基本的に知っておかなくてはいけないのが基礎となっているPSR-0とPSR-4の知識とcomposerのオートロードに関してです。
PSRというのは、「PHP Standards Recommendations」の略でPHP-FIGと呼ばれる有名なPHPプロジェクトに参加しているグループが、共通化を狙うべくコーディング規約を作成しています。

現在策定、草案等に上がっているPSRは18件あります。その一覧はPHP Standards Recommendations – PHP-FIGから確認することが可能です。

そもそもPSR-0やPSR-4は何が決められてるの

PSR-0やPSR-4はオートローディング用の仕様です。PSR-0はすでに非推奨となっており、PSR-0の仕様をほぼ引き継いだような形でPSR-4が策定されています。
このオートローディング用の仕様では、特定のディレクトリ構造や名前空間しなさいという決まりがあります。

このような決まりを作っていることで、composerが威力を発揮します。
Laravelのcomposer.jsonには以下の記述が存在します。

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

classmapは放置していただいて、psr-4という記述が存在します。
先程のPSR-4のことです。ここではAppという名前空間はappディレクトリにあたり、PSR-4に基本的に準拠しているというのを指す設定です。
基本的にといったのは、準拠していなくてもcomposerは別の方法でファイルをロードしたりする設定もあるので、完璧である必要は無いということです。

ただし、このようにPSR-4というものに準拠していることで、Composerは専用のオートローダーを用意してくれています。
上記のように定義をして、ディレクトリ構造もあっていて、名前空間などもあっているのであれば自動でクラスが読めます。わざわざrequireなどする必要が無いのです!(もちろんautoloadを行うファイルを読み込む必要がありますが、Laravelは標準でそれを読み込んでいるので関係ありません)
このオートローディングが効くので、Laravelで作られたアプリケーションのフォルダ構造が異なっていたとしてもPSR-4に準拠していれば自動でロード出来るということになります。これは、今までここに置かないと動かないと決めつけていた人には少しとっつきにくいですがそのようなものと理解しましょう。自分自身でディレクトリ構成を決めてオートローディングされるのは非常に気持ちが良いです。

Reflection

一番の肝となるのは、Reflectionクラスです。
Reflectionを知っているか知らないかでLaravelの理解に差が出るのではと思ってます。

簡単にReflectionを説明するとすれば、クラス自体を外から操作できちゃうクラスです。
また、外から操作しているにも関わらずクラス内のprivate,protectedメソッドを呼んだりすることもできます。すごい。

Reflectionのクラスは以下の様に作成できます。

$reflector = new ReflectionClass($concrete);
$concreteには、クラスのオブジェクトまたはクラス名(完全修飾名)を渡すことでリフレクション出来るようになります。

Reflectionはほかにも、ReflectionParameterクラスという、関数やメソッドのパラメータ情報を取得するクラスも存在しています。
メソッドのパラメータ(引数)の情報を取得できるからこそ、コンストラクタインジェクションやメソッドインジェクションが出来るのです~。

この2つの知識について軽く解説しましたが、結局はソース読まなくては理解は進みません。
そのソースを読むために便利なツールを次に紹介します。

デバッガーを利用しよう。

デバッガー、使ってますよね?
もしもechovar_dumpddなどしか使ってないのであれば是非Xdebugを利用しましょう。

Xdebugで使える機能として、リモートデバッグ機能が存在します。
これは、リモートで動いているPHPアプリケーションを途中で中断させながら見ていける機能です。
一部のIDEはXdebugのリモートデバッグに対応しており、こちらを利用することでこの行の処理の状態の時、変数には何が入っているとかそういう情報を随時確認することができます。非常に強力で、どうしてもわからなくなったときに重宝します。

導入方法に関してなのですが、導入は環境によって異なってくるので調べてください・・・。
remiとかで入れてたらyum install --enablerepo=remi,remi-php56 php-pecl-xdebugとかでxdebug自体が入ります。
リモートデバッグを行うには、設定ファイルのiniの修正も必要です。こちらは他の人が書かれているものを参考にしていただけると・・・!

実際のところ、このXdebugですが私も導入するのはそこまで得意ではありません。。。上手く動かないことが多々あります。
でも、これはソースを追うのに本当に良いので是非使ってない方は使いましょう。

ここでは説明していませんが、laravel-debugbarというアプリケーション自体に埋め込んでデバッグを楽にするものもあるので導入をしても良いかもしれません。(ただし、結構無茶なことをやってるみたいなので場合によってはLaravelアプリケーションが動かなくなることもあったり。。。)

最後に

基本的なことは上記のことだと思いますが、最終的にはちゃんとLaravelの概要を掴んでソースを読めるようになるのが良いですね。
あとはlaravel/frameworkのリポジトリをwatchするとか。
私も完璧にわかってるわけでもないので、例えば自分は知らない機能だけど知りたい人が居たときに肩代わりしてソースを追ってみてあげたりとか。そこで新しい発見に出会えるかもしれません。

明日は shimadam さんの「デザインレビューについて」です~。

Pocket

 Posted by at 12:00 AM

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*