2014-02-16

【3分でわかる】今さら聞けない、PHPのパッケージ管理ツール『Composer』

php-composer.jpg

[ PR ]


PHPのパッケージ管理ツール『Composer』

最近よくComposerという言葉を聞きますが、なんだか新しいものは敬遠しますね。

簡単に言うとRubyにおけるgemです。・・・と言ってもよくわかりませんよね。

そもそもComposerとは何なんでしょうか。

パッケージ管理ツールとは

package.jpeg

パッケージとは、ライブラリに読み替えてもらっていいと思います。

例えば車を例にとると、車は以下のようにたくさんのパーツからなっています。

car_parts.jpg

これをPHPで表すと以下のようになります。

car-php.jpg

このとき、「Car.php は Engine.php に依存している」といえます。

このように、複雑なライブラリになればなるほど依存しているライブラリが多くなります。

Composerとは

これを踏まえると、ComposerはPHPのライブラリを管理するツールだということがわかります。

しかも先程の車の例のように、依存しているライブラリを自動でインストールして、1つのファイルを読み込むだけで利用できるようにすることができます。

つまり、先程のツリーの図でいうCar.phpに当たるもの(実際は autoload.php)を読み込むことになります。

PHPのインストール

早速インストールをはじめてみます。

まずPHPがインストールされているかを確認します。

php -v

# PHP 5.4.17 (cli) (built: Aug 25 2013 02:03:38)
# Copyright (c) 1997-2013 The PHP Group
# Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

このような表示が出なければPHPをインストールしてください。(大丈夫であれば飛ばして下さい)

# Mac
brew install php

# Linux (例)
apt-get install php

Windowsユーザは http://www.jp.t2softworks.com/php/s1.htm を参照してインストールしてください。

Composerのインストール

PHPがインストールできたところで、Composerをインストールしてみます。

Windowsユーザについては適宜読み替えてください。

まず適当なフォルダを作ります。

cd /適当なフォルダ/
mkdir composer-test
cd composer-test

これで「composer-test」というフォルダにいることになります。

このフォルダにcomposerをインストールします。

curl -s http://getcomposer.org/installer | php

するとフォルダの中に composer.phar というファイルがダウンロードされます。

php composer.phar

#    ______
#   / ____/___  ____ ___  ____  ____  ________  _____
#  / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
# / /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
# \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
#                     /_/
# Composer version 9896abeb380f65a146e988f51b46cdb8e1b88e01 2014-02-13 15:23:53

こんな感じの表示が出ればインストール完了です。

他の新しいプロジェクトを作る際にもこれを繰り返すことになるので、コマンドを作っておきます。

# Mac / Linux
sudo echo "curl -s http://getcomposer.org/installer | php" > /usr/bin/install_composer
sudo chmod 755 /usr/bin/install_composer

これで後からインストールするのが楽になります。

Twigを例にとって練習

ここからはComposerの練習として、Twigというテンプレートエンジンをインストールしてみます。

まずtwigを探してみます。

php composer.phar search twig

# twig/twig Twig, the flexible, fast, and secure template language for PHP
# twig/twig Twig, the flexible, fast, and secure template language for PHP
# twig/extensions Common additional features for Twig that do not directly belong in core
# symfony/twig-bridge Symfony Twig Bridge
# yiisoft/yii2-twig The Twig integration for the Yii framework
# phpdocumentor/template-responsive-twig Responsive modern template for phpDocumentor for Twig
# symfony/twig-bundle Symfony TwigBundle
# zf-commons/zfc-twig Zend Framework 2 Module that provides a Twig rendering strategy and extensions to render actions or trigger events from your templates
# cedriclombardot/twig-generator A generator for PHP code based on Twig template engine
# jms/twig-js twig.js, flexible, secure, and high-performance templating engine for Javascript
# jms/twig-js-bundle Integrates twig.js into your Symfony2 application
# asm89/twig-cache-extension Caching template fragments with Twig.
# simonjodet/twig Twig, the flexible, fast, and secure template language for PHP
# webvariants/twig integrates the Twig template engine into SallyCMS
# mapado/twig-extensions-bundle Provides some Twig extensions for your project.
# data-uri/twig-extension Twig extension for data URI ; Converts datas to the data URI Url scheme (RFC 2397)

ちょっと見づらいですね。見やすくしましょう。

php composer.phar search twig | perl -pe "s/^(.*?) .*/\1/g"

# twig/twig
# twig/twig
# twig/extensions
# symfony/twig-bridge
# yiisoft/yii2-twig
# phpdocumentor/template-responsive-twig
# symfony/twig-bundle
# zf-commons/zfc-twig
# cedriclombardot/twig-generator
# jms/twig-js
# jms/twig-js-bundle
# asm89/twig-cache-extension
# simonjodet/twig
# webvariants/twig
# mapado/twig-extensions-bundle
# data-uri/twig-extension

twig/twig というのが本家になるので、それをインストールします。

# バージョン1系をインストール
php composer.phar require twig/twig:1.*

# 最新版がよければ以下
php composer.phar require twig/twig:*

すると次のように表示され、インストールが完了します。

# ./composer.json has been updated
# Loading composer repositories with package information
# Updating dependencies (including require-dev)
#   - Installing twig/twig (v1.15.1)
#     Loading from cache
# 
# Writing lock file
# Generating autoload files

インストールが済んだら、index.phpを作って、次のように書きます。

<?php

require_once 'vendor/autoload.php';

$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader);

echo $twig->render('Hello {{ name }}!', array('name' => 'Fabien'));

?>

先程ちょっと説明したように、vendor/autoload.php というのが入っていますね。

これを require するとすべてがロードされます。

実行

早速実行してみます。

php index.php

# Hello Fabien!

きちんと表示されていますね。Twigテンプレートが正しく動いている証拠です。

何が起こっているのか

一体何が起こったか分からなかったですね。ちょっと何がおこっているのかを再度見ていきます。

index.phpを再度見てみると、次のようなコードでした。

<?php

require_once 'vendor/autoload.php';

$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader);

echo $twig->render('Hello {{ name }}!', array('name' => 'Fabien'));

?>

requireに秘密がありそうなので、vendorフォルダを見てみます。

ls vendor

# autoload.php  composer  twig

確かに autoload.php がありますね。ちょっと見てみましょう。

cat vendor/autoload.php
<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer' . '/autoload_real.php';

return ComposerAutoloaderInitc090219b1d1f487c442550d55aafd425::getLoader();

?>

するとまた require があり、composer/autoload_real.php を読み込んでいるようです。

cat vendor/composer/autoload_real.php
<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInitc090219b1d1f487c442550d55aafd425
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInitc090219b1d1f487c442550d55aafd425', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInitc090219b1d1f487c442550d55aafd425', 'loadClassLoader'));

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

        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->set($namespace, $path);
        }

        $map = require __DIR__ . '/autoload_psr4.php';
        foreach ($map as $namespace => $path) {
            $loader->setPsr4($namespace, $path);
        }

        $classMap = require __DIR__ . '/autoload_classmap.php';
        if ($classMap) {
            $loader->addClassMap($classMap);
        }

        $loader->register(true);

        return $loader;
    }
}

function composerRequirec090219b1d1f487c442550d55aafd425($file)
{
    require $file;
}

?>

なんだかそれらしきPHPがありますね。

・・・とまぁこんな感じで、自動的にPHPを次々と読み込んでいるんです。

詳しく知りたい方は、もう少し深く階層を辿るとよく分かると思います。

まとめ

今回解説したのは

  • パッケージ管理とは何か
  • Composerがどういうものなのか
  • Composerのインストール
  • Composerの使い方
  • Twigのインストールと実行
  • 何がおこっているのかをたどってみる

ということです。

まだあまり理解できていないという方は、もう一度読み返して実際に実行してみるといいと思います。

実用的には、ライブラリの名前くらいは知っておく必要がありますが、それはその都度検索するといいと思います。

気づけばプロ並みPHP~ショッピングカート作りにチャレンジ!
谷藤賢一
リックテレコム
売り上げランキング: 17,768

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.