Composer

パッケージマネージャーPHP依存関係管理オートローディングLaravelSymfonyPackagist

パッケージマネージャー

Composer

概要

Composerは、PHPのための依存関係管理ツールで、プロジェクトに必要なライブラリやパッケージの宣言、取得、管理を可能にします。現代のPHP開発の基盤となるツールとして、composer.jsonファイルでの設定管理、PSR-4準拠の自動オートローディング、Packagistリポジトリとの統合を提供します。Laravel、Symfony、その他主要なPHPフレームワークとシームレスに統合され、バージョン制約による正確な依存関係解決、高性能な本番環境最適化オプションを備えています。

詳細

Composerは2012年にNils Adermann、Jordi Boggiano らによって開発され、Node.jsのnpmやRubyのBundlerにインスパイアされて作られました。PHPエコシステムの標準的な依存関係管理ツールとして確立され、PSR-0/PSR-4自動読み込み規約の普及に大きく貢献しました。composer.jsonファイルでプロジェクトのメタデータと依存関係を定義し、composer.lockファイルで正確なバージョンを固定することで、開発環境と本番環境での一貫性を保証します。PackagistはComposerのメインリポジトリとして機能し、世界中のPHPパッケージを配布しています。クラスマップ最適化、APCuキャッシュ、権限付きクラスマップなどの性能最適化機能により、本番環境での高速なクラス読み込みを実現します。

メリット・デメリット

メリット

  • 統一された依存関係管理: PHP エコシステムの標準ツールとして広く採用
  • 自動オートローディング: PSR-4/PSR-0準拠の自動クラス読み込み
  • バージョン制約: セマンティックバージョニングによる柔軟な依存関係管理
  • フレームワーク統合: Laravel、Symfony等主要フレームワークとの完全統合
  • パフォーマンス最適化: 本番環境向けの複数の最適化オプション
  • 豊富なエコシステム: Packagistを中心とした膨大なパッケージライブラリ
  • 安定性: composer.lockによる再現可能なビルド環境

デメリット

  • 初期学習コスト: 依存関係解決の概念とコマンド理解が必要
  • ディスク容量: vendorディレクトリが大容量になる場合がある
  • 依存関係地獄: 複雑な依存関係での競合解決が困難な場合
  • ネットワーク依存: パッケージ取得にインターネット接続が必要
  • セキュリティリスク: サードパーティパッケージの脆弱性リスク
  • アップデート複雑性: メジャーバージョンアップ時の破壊的変更

参考ページ

書き方の例

基本的なプロジェクト管理

# Composerの入手(グローバルインストール)
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

# プロジェクトの初期化
composer init

# 依存関係のインストール
composer install

# パッケージの追加
composer require monolog/monolog
composer require phpunit/phpunit --dev
composer require laravel/framework

# パッケージの削除
composer remove monolog/monolog

# 依存関係の更新
composer update
composer update monolog/monolog

composer.json設定

{
    "name": "mycompany/myproject",
    "description": "A sample PHP project",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Developer Name",
            "email": "[email protected]"
        }
    ],
    "minimum-stability": "stable",
    "prefer-stable": true,
    "require": {
        "php": "^8.1",
        "monolog/monolog": "^3.0",
        "guzzlehttp/guzzle": "^7.0",
        "symfony/console": "^6.0",
        "doctrine/orm": "^2.10"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0",
        "friendsofphp/php-cs-fixer": "^3.0",
        "phpstan/phpstan": "^1.0",
        "mockery/mockery": "^1.5"
    },
    "autoload": {
        "psr-4": {
            "MyCompany\\MyProject\\": "src/"
        },
        "files": [
            "src/helpers.php"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "MyCompany\\MyProject\\Tests\\": "tests/"
        }
    },
    "scripts": {
        "test": "phpunit",
        "cs-fix": "php-cs-fixer fix",
        "analyze": "phpstan analyse",
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ]
    },
    "config": {
        "optimize-autoloader": true,
        "classmap-authoritative": true,
        "apcu-autoloader": true,
        "sort-packages": true
    }
}

オートローディングの使用

<?php
// Composerオートローダーの読み込み
require_once __DIR__ . '/vendor/autoload.php';

// PSR-4準拠のクラス使用
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use GuzzleHttp\Client;
use MyCompany\MyProject\SampleClass;

// ログ設定
$log = new Logger('app');
$log->pushHandler(new StreamHandler('app.log', Logger::WARNING));
$log->warning('This is a warning message');

// HTTPクライアントの使用
$client = new Client();
$response = $client->request('GET', 'https://api.example.com/data');

// 自作クラスの使用
$sample = new SampleClass();
$result = $sample->process();

// ファイルオートロードの例
// src/helpers.php が自動的に読み込まれる
if (function_exists('custom_helper_function')) {
    $output = custom_helper_function('input');
}
?>

バージョン制約とアップデート

# セマンティックバージョニングの例
composer require "monolog/monolog:^3.0"     # 3.0.0 <= version < 4.0.0
composer require "guzzle/guzzle:~6.3.0"    # 6.3.0 <= version < 6.4.0
composer require "symfony/console:>=5.0"   # 5.0.0以上

# 開発版の使用
composer require "vendor/package:dev-master"
composer require "vendor/package:dev-feature-branch"

# 特定の安定性レベル
composer require "vendor/package:2.0.x-dev"
composer require "vendor/package:@dev"

# バージョン情報の確認
composer show
composer show monolog/monolog
composer show --installed
composer show --tree

# アップデート操作
composer update --dry-run          # 変更予定の確認
composer update --no-dev           # 本番用(開発依存除外)
composer update --with-dependencies # 依存関係も含めて更新

プロジェクト作成とフレームワーク統合

# Laravelプロジェクトの作成
composer create-project laravel/laravel myapp
cd myapp
composer require laravel/breeze --dev

# Symfonyプロジェクトの作成
composer create-project symfony/skeleton myapp
cd myapp
composer require webapp

# SlimやLaminasフレームワーク
composer create-project slim/slim-skeleton myapp
composer create-project laminas/laminas-mvc-skeleton myapp

# フレームワーク固有のパッケージ
composer require laravel/passport      # Laravel OAuth2
composer require symfony/mailer        # Symfony メーラー
composer require doctrine/migrations   # Doctrine マイグレーション

# 開発ツールの追加
composer require --dev barryvdh/laravel-debugbar
composer require --dev symfony/profiler-pack

高度な設定とパフォーマンス最適化

# パフォーマンス最適化(本番環境)
composer install --no-dev --optimize-autoloader
composer dump-autoload --optimize --classmap-authoritative

# APCu キャッシュの有効化
composer install --apcu-autoloader
composer dump-autoload --apcu

# プラットフォーム要件の設定
composer config platform.php 8.1.0
composer config platform.ext-mbstring 1.0.0

# プライベートリポジトリの設定
composer config repositories.private-repo vcs https://github.com/company/private-repo
composer config repositories.company-satis composer https://packages.company.com

# 認証情報の設定
composer config github-oauth.github.com YOUR_TOKEN
composer config http-basic.private-repo.com username password

# キャッシュ管理
composer clear-cache
composer config cache-files-ttl 86400
composer config cache-dir /tmp/composer-cache

スクリプトとワークフロー自動化

{
    "scripts": {
        "dev": [
            "Composer\\Config::disableProcessTimeout",
            "php -S localhost:8000 -t public"
        ],
        "test": [
            "phpunit --coverage-text",
            "phpstan analyse src",
            "php-cs-fixer fix --dry-run"
        ],
        "deploy": [
            "composer install --no-dev --optimize-autoloader",
            "php artisan config:cache",
            "php artisan route:cache",
            "php artisan view:cache"
        ],
        "post-update-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize",
            "@php artisan package:discover"
        ],
        "pre-install-cmd": [
            "echo 'Starting installation...'"
        ]
    },
    "scripts-descriptions": {
        "dev": "Start development server",
        "test": "Run all tests and code quality checks",
        "deploy": "Deploy to production environment"
    }
}

セキュリティと監査

# セキュリティ監査(Laravel用)
composer audit

# アドバイザリチェック
composer require --dev roave/security-advisories:dev-latest

# パッケージライセンス確認
composer licenses

# アウトデートパッケージの確認
composer outdated
composer outdated --direct

# 脆弱性のあるパッケージの検出と修正
composer update --with-dependencies
composer require package/name:^2.0  # セキュアなバージョンに更新

# lockファイルの検証
composer validate --strict
composer check-platform-reqs