Laravelで学ぶcomposer

Posted: 2015-02-16 01:01 |  laravel PHP全般 

composerとは何者か

composerについてはweb上の色々なところに参考になるものが沢山あります。
まずはその辺りをしっかり目を通してみてください。
まずは公式 Composer
Composer ドキュメント日本語訳 (個人の方の日本語翻訳です。)
Composerを活用したモダンな開発手法
などなど、沢山あります。

composer.json使ってjsonで書きたくないという人は
さすがにこのご時世にはいないと思いますが、node.js, java, rubyなどにもあるパッケージ管理ツールであり、
ユーザーが自由に利用できるオートローダーでもあります。
パッケージ管理ツールオンリーだと思っている方も多いですが、

そんなことはありません、お間違えなく

オートローダーとは何か

Laravelに限ったことではありません。
最近のフレームワークのほとんどはcomposerを利用していて、
ほとんどがcomposerのオートローダーを利用して構築されています。

レガシーなPHP環境を触っている方はおなじみの、
require, require_once, include, include_once などがありますが、
これらは外部のphpファイルを読み込む場合に利用するもので、
運用・保守などで、ファイルの上部や、関数の中にあったり、
またはinclude.phpとかそういう名前で大量のrequireなどを見たことがある方も多いはずですが、
そんなものを書かなくても勝手にやってくれる仕組みがオートローダーというものです。

オートローダーを利用する上で知っておくこと

このオートローダーを利用するには数種類選択肢があります。
フレームワークを利用する上で、このオートローダーの種類を知っているかどうかが

最初の壁になります。

では一つずつ見ていきましょう。
autoload

PSR-4

PSR-4の前に、下記のものを理解しておく必要があります。

PSRというのは、PHP Framework Interop Group 通称PHP-FIG という、
海外の著名なPHPの開発者が、それまでライブラリやフレームワークでばらばらだったコーディング規約とか
そういうものをみんなで標準的なものを定めていきましょう、
という基準で定めた標準コーディング規約です。
日本語訳されている方や、まとめている方も多いので、それぞれがなんなのかというのはすぐにわかると思います。
PHPコーディング規約まとめ
PSR-0, 1, 2を日本語に翻訳してみました
 
新標準PSRに学ぶきれいなPHP from yandod

この規約の中で、PSR-0とPSR-4が前述したオートローダーに関する規約となり、
composerで利用出来るオートローダーの選択肢のうちの一つです。
が、現在はPSR-0はdeprecated 非推奨 となっていますので、
PSR-4のみ、だと思っても良いかもしれません。
PSR-4で定められているオートローダーに関する規約の詳細はいろんなところに書かれているので
そちらを参照してください。
要するに、わかりやすく言うとディレクトリと名前空間の関連性です。
このルールに従うことで簡単にクラスを呼んでくれます。
名前空間 ディレクトリ ファイルパス
\Hoge\Controllers\HogeController ./app/Controllers ./app/Controllers/HogeController.php
上記の場合、
appディレクトリは名前空間Hogeとして関連付けます。
composer.jsonで記すと下記のようになります。
  "autoload": {
    "psr-4": {
      "Hoge\\": "app/"
    }
  },
app/ディレクトリ以下はHogeとなり、
app/Abcd/Efg/H.class を利用する場合の名前空間は、\Hoge\Abcd\Efg\H となります。
利用している構造によっては、app/AbcdをHogeとしても良いですし、
app/Abcd/EfgをHogeとしてもいいです。
  "autoload": {
    "psr-4": {
      "Hoge\\": "app/Abcd/"
    }
  },
ですが極端にディレクトリと異なるものにしてしまうとわかり辛くなると思いますので、
やめておきましょう。
つまり、名前空間を利用しなければなりません。
Laravelのファサードは、app.phpに記されていますが、
Appを例にすると、
'App'  => 'Illuminate\Support\Facades\App',
とされていますが、
Illiminate\Support\Facades\AppをAppという別名で利用できるようにします、
ということであり、Appで利用できるようになりますが、
名前空間を利用しているクラスの中で利用する場合に、
Appとしてcallすると、その名前空間に属するAppを呼んでいる、ということになります。
そのため \App とすることで、実装しているクラス内のAppではなく、
独立したAppクラスの事ですよ、という意味になります。
javaやasや、インポートを利用する言語を経験している方はすぐにわかると思います。
PHPの名前空間
クラスの頭でuseを書くとこの頭の\を書かなくても、useに書かれているクラスの事ですね、
と判断してくれます。
名前空間を利用することで何が良くなるのかといえば、
同じ名前のクラスを作っても名前空間さえ違えば混同されることはなくなりますし、
このクラスは一体どこに定義されてるものなんだよ・・と探さなくても済みます。
規約に沿った内容であれば、どこに何のクラスがあってもrequireなど書かなくても勝手に呼んでくれます。
他にも利点はありますが、この辺で。
Laravel5ではデフォルトで採用されています。

classmap

classmapはもう少しレガシーよりな指定方法と思っておくと良いかもしれません。
PSRのように標準化されたものではありませんので、これを利用する場合は名前空間は利用しません。
が、PSRで指定されているクラスを利用する場合はnew \Hoge\Abcd\E() として利用しなければなりません。
実際にはほとんどの方がIDEを利用しているはずですので、
この辺は意識しなくてもIDEが勝手に全部書いてくれます。
IDEを利用していない方は、中、上級者以外の方はすごく理解しづらいと思います。
(PSR-4も同じかもしれませんが)
利用方法は簡単で、読み込みたいクラスが存在するディレクトリを記述しておけば
クラス名だけで利用することができます。
  "autoload": {
    "classmap": [
      "app/"
    ],
  },
  
この指定をした時は、app配下にあるクラスを自由に使うことができます。
app/Hoge.php であればnew Hoge()となります。
が、ディレクトリとクラスの関連性は、あくまでcomposer.jsonで指定した範囲のみとなりますので、
ディレクトリをapp配下に掘った場合、app/fuga/Hoge.php を利用する場合にはnew Hoge()と書いても
利用できません。
指定したディレクトリ外となる為、オートローダーにクラスが存在する場所を教えなければなりません。
$ composer dump-autoload
ですね。
名前空間を利用しないので、同じクラス名が存在するとエラーとなります。
規模の大きくないもので利用するケースが多いかもしれません。
Laravel4ではこれがデフォルトとして採用されていました。

files

これはクラス単位では利用することは少ない指定方法だと思います。
文字通り、オートローディングしたいメソッドなどが記述されたヘルパー的なものや、
モダンなPHP環境ではほとんど利用する機会はないと思いますが、
レガシーな環境でありがちなdefine地獄などを纏めたファイルを指定するなど
いくつか利用するケースはあると思います。

利用できるオートローダーの選択肢としては以上の3つです。
Laravel5では名前空間を利用しないといけない、強制されるので使い辛い等
思われる方もいるかと思いますが、

気に食わなければ変更しても良いんです。

PSR-4からclassmapに変更しても良いですし、Laravel4をPSR-4にしても構いません。
規約や利用方法を把握しておけばどれを利用しても問題ありません。
また、オートローダー指定にこれらが混在していても問題はありません。
頭に\やuseを書かずに利用したい場合はオートローダーを変更してみてください。
ただPSR-4指定のものに対して、さらにspl_autoloadやclass_aliasを利用するのはおすすめしません。
IDEで保管されないという点や、規約から外れたものでラッピングすると理解し辛くなります。
オートローダーのオートローダーという、車輪の再発明のようなものになります。

このオートローダーさえ理解して、phpstormなどの優秀なIDEがあればもう制覇したと言っても過言ではないでしょう!
自分で書かなくてもIDEがすべてやってくれますので、
名前空間に慣れていない方は慣れる時間を少しだけ取ってみると良いでしょう。

scriptsとは何か

composer.jsonの下の方に記述されていますが、
これはcomposerで用意されているイベントごとに独自のスクリプトを実行する場合に利用します。
イベントはたくさんあります。
イベントリスト
たとえば、Laravel5でいえば、環境変数を定義する.envに特定の環境変数を入れたい場合などがあるかもしれません。
export LARAVEL_ENV="ja"
export LARAVEL_LANG="production"
などが書かれている場合、これらを.emvに反映させたりいろんな用途が考えられます。
その場合は、
  "scripts": {
    "post-autoload-dump": [
      "php detect.php"
    ]
  },
post-autoload-dumpでphpのスクリプトを動かして特定の変数を.envに追記するなどという方法が取れると思います。
デプロイ時などで多用することがあるかもしれません。
たとえばviewのcacheファイルなどを削除するコマンドだったり、
phpスクリプト以外でもOKです。

力尽きたので続きはまたいつの日か

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014