Windows10 + XAMPP & Composer -> Laravel

# 学生からPEARを使いたいと言われた -> [Composer](https://getcomposer.org/)もあるよ
[前回の投稿](http://qiita.com/zenno04/items/d3a3e598ca87b744514e)は学生からPEARでパッケージをインストールしたいと言われた話でしたが，今は似たようなものにComposerというものがあります。[CakePHP3](http://book.cakephp.org/3.0/ja/index.html)や[Laravel](http://laravel.jp/)なんかもComposerを使ってねとかなってるので伝えたかったけど，なんかよくわからないものを一気に教えられると処理しきれない可能性があると思ってぐっと我慢したら，友人から「今ならComposerも使えたほうがいいと思うよ」と，至極まっとうな意見をもらったので新しく書くことにしました。

# 到達目標
1. Composerをインストールする
2. composer.json の基本の書き方を知る
3. 試しにLaravelをインストールしてみる
4. 勢い余ってLaravelに「Hello world.」してみる

# 環境(前回と一緒)
* Windows10
* XAMPP 5.6.28

# そもそもComposerってなに？
プロジェクト（作ろうとしてるもの）で必要なライブラリやパッケージを管理し，みんなの開発を助けようというものです。「パッケージ管理システム（Package Manager）」といいます。ただのパッケージ管理システムではなく，インストールしたいパッケージを使用するために必要な別のパッケージへの依存関係も解消してくれます。なので，正確にはComposerは「依存関係管理システム」ってことになります。ざっくりいうと，「必要なものを自動で一気にインストールしてくれる」ってことです。
PEARでいいんじゃない？ってなるかもしれませんが，前回PEARの利用で管理者権限を求められました。自分のPCでやっている分には問題にはならないところではあるのですが，会社のPCなど自分の管理下にないPCだと，パッケージのインストールに際して，毎回管理者権限のある部署の方にインストールをお願いすることになったりとちょっとしんどいことになります。
一人で開発しているときはあまり問題にならないのですが，複数人で一つのプロジェクトを作っていると，みんなのパッケージの状態をそろえるのに一苦労します。Composerを使うと利用したいパッケージを「composer.json」という専用のファイルに書き込んで，その情報をもとにインストールをすることが可能になります。composer.jsonの共有ができればパッケージ情報の共有が可能になるので，このあたりも非常に素敵なことだと思います。このように設定を書き出しておいて共有するというのは何もComposerに限ったことではなく，今の世の中には多くのパッケージ管理システムが存在します。（[Node.js](https://nodejs.org/ja/)の「[npm](https://www.npmjs.com/)」とか）
そんなわけで，Nils AdermannさんとJordi Boggianoさんに最大限の感謝をしつつ，今回はどんなものなのかを見ていこうと思います。
ちなみに，Composerは作曲家や作家という意味です。公式ページのトップ画像にも納得ですね。
注意点としては「PHP 5.3.2以上」じゃないと使用できないという点です。
[composerのGitHubはこちら](https://github.com/composer/composer)

# よし，Composerをインストールしよう
兎にも角にも[公式ページ](https://getcomposer.org/)に行きます。「Dependency Manager for PHP」と出迎えてくれます。「PHPの依存関係の管理者」だそうです。もう，なされるがままに管理してもらいましょう。

「Getting Started」から開始です。いきなり「Composer is not a package manager...」と続いて面喰いますが，どうやら，「aptとかyumみたいなもんじゃなくて，プロジェクトごとに個別にインストールできるよ。グローバルに（PCのどこからでも使えるように）プロジェクトをインストールしたかったら『global』コマンドつけてね」みたいなことが書いてあるようです。プロジェクトごとにパッケージを管理できるなんて超素敵です。「This idea is not new and Composer is strongly inspired by node's npm and ruby's bundler.」って書いてある通り，もともとある他のシステムに触発されたとのこと。でもPHPにはそんなんなかったから作ってみたよってことらしい。マジ感謝。

インストール手順は以下の通り
1. 公式ページからダウンロードして実行
2. 使用するPHPの選択
3. 使用するプロキシサーバのURLの登録
4. インストール情報の確認

さて，詳細ですが，[ダウンロードページ](https://getcomposer.org/download/)に行ってゲットしてこいと言われるので，言われるがままWindows用のインストーラー「Composer-Setup.exe」のリンクをクリックし，ダウンロードして実行します。例のごとく「デバイスに変更を～」といったダイアログが出るのでOKしてセットアップに進みましょう。
使うPHPを選択しろと言われるので，XAMPPのPHP（デフォルトなら，C:\xampp\php\php.exe）を選択します。私はXAMPPの中か，仮想マシンにしかPHPを入れていないので，デフォルトでXAMPPのPHPが選択されていました。
プロキシの設定は，プロキシサーバを介して通信をしている方のみプロキシサーバのURLを指定していただければいいものです。私は関係ないのでいじらずに次に進みます。
「Ready to Install」と，インストール情報が表示されているので，選択されているPHPのバージョンが 5.3.2 以上ということと，プロキシサーバの設定をした方はその設定に間違いがないかを確認し，「Add to System path」の内容を覚えられない人はメモしましょう。ここに指定指定されているところから使えるようになりますよというお話なので，間違いがなければ，どーんっ！と「Installボタン」を押しましょう。そしてお茶でも飲みましょう。などと言っている暇もなく，マッハでインストールが完了してメッセージが出ます。
「Information」として，大事な情報があるので読みましょう。要は「環境変数を書き換えたけど，今動いてるプログラムはそのことわかんないから，最初に使うときは以下のことをやってみてね」ってことです。
* 新しくコマンドプロンプトを開いてね
* 今開いているエクスプローラやコマンドプロンプトを閉じて，新しくコマンドプロンプト開いてね
* つーか，ログオフから再ログインしてコマンドプロンプト開いてね
とのことです。
次の画面は，オンラインのドキュメントを見ますか？というチェックボックスがありますが，すでに公式ページを開いているので，特にチェックは入れずに終了しました。古いコマンドプロンプトは閉じて，新しいコマンドプロンプトを開き，以下のコマンドで composerがインストールされているか確認しましょう。

`>composer -V`

うまくいけば，バージョンの情報が表示されます（オプションは大文字の「V」なのでお間違えの無いように）。やったね。しかし，インストーラーでインストールすると自動的に環境変数PATHにcomposerのパスが指定されるようです。便利でよいのですが，これが嫌な場合は環境変数PATHからcomposerのパスを削除すると良いでしょう。
インストーラーを使わないインストールの仕方も載っており，こちらならより細かい設定ができそうな気もしますが，今回はめんどくさいので割愛します。

# composer.jsonを書いて，Composerを使う
さあ，いよいよcomposerの楽しいところに差し掛かりました。composer.jsonを作成し，その効果を体験したいと思います。
公式サイトをたどって[基本の使い方](https://getcomposer.org/doc/01-basic-usage.md)に突撃します。
サンプルとして「monolog/monolog」をインストールしてみるよなんてことを言っているので，試します。
とりあえず，htdocsに移動して，プロジェクトのフォルダを作成し，その中に入りましょう。

```
>cd C:\xampp\htdocs
>mkdir test_composer
>cd test_composer
```

さて，あとはこのフォルダの中にcomposer.jsonを作成します。作業はお好みの[Vim](https://www.kaoriya.net/software/vim/)とか[Spacemacs](http://spacemacs.org/)とか[Atom](https://atom.io/)とか[PhpStorm](https://www.jetbrains.com/phpstorm/)とか使えばいいんじゃないでしょうか。とりあえずファイルの内容は以下の通り。

```json:composer.json
{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}
```
「require」に設定されたパッケージがインストールされると思いましょう。
パッケージ名の後の数字はバージョン番号。今回は，「1.0.*」で1.0以上1.1未満のバージョンの中で安定版がインストールされるって感じです。
JSON形式で書けるので，パッケージは「,」で区切って複数記述が可能ですが，今回は公式サイトに従い，このままいきましょう。
我慢できないのでこのまま動かしましょう。

`>composer install`

「頑張って依存関係更新してるよー」みたいな可愛いことを言いながら頑張ってくれます。
終了したので，フォルダの中身がどう変わったのか確認してみます。フォルダの階層構造の確認はtreeコマンドで調べられます。フォルダツリーのツリーなんでしょうよ。なんのツリーなのかを指定しないのは，PCがディレクトリ（フォルダ）の中身に対して様々な処理を行っていくからと思えばある程度納得できるのではないでしょうか。
`>tree`
ちなみに，結果はこんな感じ。

```
C:\XAMPP\HTDOCS\TEST_COMPOSER
└─vendor
    ├─composer
    └─monolog
        └─monolog
            ├─doc
            ├─src
            │  └─Monolog
            │      ├─Formatter
            │      ├─Handler
            │      └─Processor
            └─tests
                └─Monolog
                    ├─Formatter
                    ├─Functional
                    │  └─Handler
                    ├─Handler
                    │  └─Fixtures
                    └─Processor
```

なんかいろいろ入ってるよ万歳！ってなったら成功です。
もっとComposer的な操作で頑張るなら，composer.jsonの存在するディレクトリ内で

`>composer show`

すると，composer.json内のrequireに記録されている情報を表示してくれます。

ちなみに，[monolog](https://github.com/Seldaek/monolog)さんはエラーなどのログ情報を強烈に記録してくれる（Logging）機能です。実際にサービスの開発をするときにでもお世話になるとして，今日のところはそっと忘れましょう。
`>tree /f`
ってすると，ファイルのことも含めて表示してくれるから超感動できます。だって，「autoload.php」の文字が見えるから。いくら便利にインストールしてくれるとしても，大量のパッケージを一個一個「require_once」なりしていくのは果てしなくめんどくさいです。vendorフォルダ内のautoload.phpを読み込んでおけば，Composerで管理しているパッケージを一気に読み込んでくれるとあっては感動が抑えられません。

なお，Composerにはまだまだ便利なオプション/機能/使い方が多数存在する

# 突然のゲシュタルト崩壊
ここまでやってきてなんなんですが，日常的に使っている「依存性」って言葉とここでいう「依存関係」に果てしない距離感を感じます。Loggingの機能は現状「追加装備」であって，決して自分の作るプロジェクトがそれがなきゃ動かないというわけではないので。そんな風に躓く人がいたらあれなので私なりの解釈をお伝えしておくと，「依存関係を定義できる仕組み」がComposerという存在なんだと思います。作曲者が自分の音楽を定義する（作曲する）ときは，どの音が欠けてもいけない状態に持っていくはずです。そして，音が多くても完璧ではないはずです。Composerはプロジェクトで使用するパッケージを「僕たちの作るプロジェクトではこのパッケージを使用するよ。多くても少なくてもいけないよ」っていうことを表現するために存在し，そのインストールなどの管理も支援してくれるのです。だから，複数人でプロジェクトの開発を行っているときにComposerはみんなの環境を同一に保ってくれるのです。僕らのプロジェクトの，文字通り「作曲家」です。素敵な名前だと思います。

# 試しにLaravelをインストールしてみる
もうちょっと依存関係の管理について実感をしてみるため，同期の子がお仕事で使っているPHPフレームワークの[Laravel](http://laravel.jp/)を導入して遊んでみたいと思います。グローバル環境にLaravelをインストールするという手段もありますが，今回はComposerを使ってLaravelのプロジェクトを作成しようと思います。
まずはプロジェクトを作成したい場所に移動します。ここは好きな場所を選択してかまいません（私はよく実験や遊んでみるために，適当な場所に「Junk」フォルダを作成します）。では，「C:\campp\htdocs」内の好きな場所に移動したら，

`>composer create-project laravel/laravel 好きなプロジェクト名 --prefer-dist`
と入力しましょう。RPGの主人公の名前を決定するときは三日三晩悩みますが，自分が遊ぶときに着けるプロジェクト名は速攻決まります。今回は「toro」という名前にしてみました。なぜって鮪のトロが食べたいから。お腹が空きました。遊び心と勢いは大切です。なので私の場合入力するコマンドは以下のようになるわけです。
`>composer create-project laravel/laravel toro --prefer-dist`
なんかすさまじい勢いで様々なものがインストールされまくっていきます。Laravelさんによって定義された依存関係（パッケージAを使用するにはパッケージBが必要などということも日常茶飯事）がまるっとインストールされていくわけです。依存関係管理ツールの面目躍如ですね。しかも[PEAR](http://pear.php.net/)とは異なり管理者権限を聞かれることもありませんでした。
インストールが完了したらcdコマンドで作成したプロジェクト内に乗り込みます。私の場合は以下のようになります。
`>cd toro`
そして，プロジェクト内で「composer show」コマンドを使ってみましょう。「Laravel/framework」や「monolog/monolog」などが見つかります。Laravelを利用するにあたって必要なものがとんでもない数登録されています。「利用するにあたって必要なもの」つまり「依存関係」です。あるパッケージを使用するのに必要なものが連鎖的にインストールされていきます。このタイミングのコマンドプロンプトはいつ見ても興奮が止まりません。（と言っても多くの場合インストールしながら別の作業を行てしまうのですが）
ちなみに，公式のインストールページには，[Laravelのサーバ要件](https://readouble.com/laravel/4.2/ja/installation.html#server-requirements)が記述されています。PHPが5.4以上であるというのはよいとして，「MCrypt PHP拡張」というのがあります。暗号化に関するものなのですが，[ここ](http://php.net/manual/ja/book.mcrypt.php)なんかに詳細が載っています。インストールの手順とか，拡張に関することとか載っているので，参考にしてください。ちなみに今回はphpinfo()でmycrypt入ってるっぽかったので気にせず次に進みます。
また，LaravelなどのPHPフレームワークの多くはURLを解析してルーティングを行います。phpinfo()のLoaded Modules内に「mod_rewrite」があることを確認しましょう。最近のXAMPPは超お手軽なので，私の環境ではすでにモジュールが有効になっていました。

# 勢い余ってLaravelに「Hello world.」してみる
インストールするだけじゃ面白くないので，実際にLaravelを使って遊んでみます。まあ，Laravelの詳細については別の記事として投稿したいと思っています。このまま書いてしまうとこの記事が異常に長くなってしまっているのでさらっと流します。
まずは，Laravelがちゃんと動く状態になっているかを確認する意味も込めて，サーバを起動しましょう。では，おもむろに
`>php artisan serve`
と，コマンドを入力してみましょう。Laravelはデフォルトで8000番ポートを使用するので，接続に関しては
`http://localhost:8000`
というURLでアクセスできます。すでに8000番ポートをほかのプログラムが使っていたら怒られてサーバは起動しません。
シンプルでカッコいい「Larabel」というページが表示できれば大成功。
このままじゃ面白くないので，ほんのちょっとだけ改造を施します。とりあえず問答無用で「Ctrlキー + Cキー」でサーバプログラムを停止させます。

細かい説明は後日投稿したいと思っていますが，今の状態でブラウザに表示されているファイルはプロジェクト内の「resourcesフォルダ内のviewsフォルダ内のwelcome.blade.php」というファイルです。つまり，ここを書き換えれば，表示が変わるはずなので，書き換えます。
とりあえず，タイトルのように表示されている「Laravel」という文字列を，「Hello World!」とでも書き換えてみましょう。
そして，再度サーバを起動させます。
超おしゃれなフォントで，「Hello World!」と表示されれば大成功。歓喜。

# 結論
* Composerは確かに便利
* 自分のプロジェクトの依存関係の定義は自分で決定して，composer.jsonに記載する
* 一人で作業するときよりも，チームで開発するときのほうが恩恵を享受できそう

# 心に誓ったこと
* 過去に学んだものは積極的に使ってちゃんと使い慣れる
* PHP7もちゃんと勉強していかなきゃ
* Laravelの記事もそのうち書く

以上，皆様お疲れさまでした。