Composer
パッケージマネージャー
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公式サイト
- Composer Documentation
- Packagist - PHPパッケージリポジトリ
- Composer GitHub
- PSR-4 オートローディング規約
- Composer セキュリティアドバイザリ
書き方の例
基本的なプロジェクト管理
# 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