Technote

by sizuhiko

Composerのautoloadを使いこなす

Composerにはautoloadを自動生成する機能があり、これを利用するとrequire_onceなどを使わなくとも自動的にソースコードがロードされます。言葉のとおりautoloadですね。

例えばCakePHPではApp::uses()という記述で利用するクラスがどこにあるのか識別して、クラスをロードできるようにするのですが、これを使わなくても Composer のautoload機能を使うとクラスが利用可能になります。

app/composer.json に以下のような定義を記述してみましょう。

{
    "autoload": {
        "classmap": ["Model", "Controller"]
    },
}

ここで autoloadだけ を更新するコマンドを実行します。

composer dumpautoload

コマンド名からはちょっと想像がつきにくいのですが、これを実行すると Generating autoload files という結果が表示されてautoload定義が更新されます。

// app/Vendor/composer/autoload_classmap.php
<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'AppController' => $baseDir . '/Controller/AppController.php',
    'AppModel' => $baseDir . '/Model/AppModel.php',
    'PagesController' => $baseDir . '/Controller/PagesController.php',
    'Post' => $baseDir . '/Model/Post.php',
    'PostsController' => $baseDir . '/Controller/PostsController.php',
);

今回は予めpostsテーブルからbakeしてPostモデルとPostsコントローラを生成しておきました。 こうすると、App::uses()を記述しなくても、composerのautoloadがクラス名からPHPファイルを自動解決してくれます。App::uses()の記述が多過ぎてコードの見通しが悪い場合などに利用を検討されてはいかがでしょうか?

この他にもComposerのautoload機能は

  • PSR-4
  • PSR-0
  • Files(ファイルを直接指定できる)
  • include-path(どうしてもphp.ini的なincludeパスで解決しなくてはならない時のためにある)

といったパス解決方法を用意していますので、namespaceが入ったものなどのサポートも万全です。

詳しくは Composerの公式ドキュメントのautoloadを参照ください。