この記事は、アイスタイル 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
から探っていくと良いでしょう。まあ、インターフェースの場合はProvider
やHttp\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つの知識について軽く解説しましたが、結局はソース読まなくては理解は進みません。
そのソースを読むために便利なツールを次に紹介します。
デバッガーを利用しよう。
デバッガー、使ってますよね?
もしもecho
やvar_dump
やdd
などしか使ってないのであれば是非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 さんの「デザインレビューについて」です~。
コメント