我们在 PHP 项目中通常会引入很多类文件,而程序运行的时候则依赖它们,如果依赖内容很多管理起来就会很麻烦,有没有一个好的办法解决这个问题,答案是肯定的,它就是 Composer
Composer
Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。
Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor
)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。
这种想法并不新鲜,Composer 受到了 node's npm 和 ruby's bundler 的强烈启发。而当时 PHP 下并没有类似的工具。
安装
- for Linux / Unix / OSX
curl -sS https://getcomposer.org/installer | sudo php
或者直接下载 phar
最新的文件
如果你需要全局使用它,你可以将它加入到环境变量 PATH
中:
mv composer.phar /usr/local/bin/composer
- for Windows
小实践
这里我们结合系列文章中内容,对之前项目中引入的类文件内容进行调整,通过 Composer
来实现自动加载。
首先,来看看之前项目中的文件 core/bootstrap.php
,内容如下:
<?php
$app = [];
$app['config'] = require 'config.php';
require 'core/Request.php';
require 'core/Router.php';
require 'core/database/Connection.php';
require 'core/database/QueryBuilder.php';
$app['database'] = new QueryBuilder(
Connection::make($app['config']['database'])
);
可以看到,这里 require
了很多依赖文件。
好,让我们开始进行调整。
首先,需要在项目个根目录创建 composer.json
文件。
Composer
文档详尽,在此之前建议多读以了解如何使快速用它。
{
"autoload": {
"classmap": [
"./"
]
}
}
这里使用通过 classmap
(类映射)的形式,以当前目录为基础,Composer
会检索目录下其它的类,并自动引入它们。
接下来,还需要前执行命令生成自动加载的相关文件:
composer install
将会项目下生成一个 vendor
目录:
打开 autoload_classmap.php
你会发现你想引入的文件已经加入进来:
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Connection' => $baseDir . '/core/database/Connection.php',
'Post' => $baseDir . '/test.php',
'QueryBuilder' => $baseDir . '/core/database/QueryBuilder.php',
'Request' => $baseDir . '/core/Request.php',
'Router' => $baseDir . '/core/Router.php',
);
如果你项目有增加新的类和依赖内容要加载,你需要重新生成一次自动加载文件,通过
composer dump-autoload
命令来实现。
接下来我们需要在项目中引入自动加载文件。
在项目的起始文件 index.php
,内容如下:
<?php
// 这里引入了自动加载文件
require 'vendor/autoload.php';
require 'core/bootstrap.php';
require Router::load('routes.php')
->direct(Request::uri(), Request::method());
接下来,你可以注释或者去掉之前 core/bootstrap.php
中的引入:
<?php
$app = [];
$app['config'] = require 'config.php';
// require 'core/Request.php';
// require 'core/Router.php';
// require 'core/database/Connection.php';
// require 'core/database/QueryBuilder.php';
$app['database'] = new QueryBuilder(
Connection::make($app['config']['database'])
);
如果再次运行项目代码,结果照旧,如你所愿。
至此我们就通过 Composer
自动加载实现了依赖管理。