PHP 新手入门指南 - Composer

2017-06-27  本文已影响184人  chansey

我们在 PHP 项目中通常会引入很多类文件,而程序运行的时候则依赖它们,如果依赖内容很多管理起来就会很麻烦,有没有一个好的办法解决这个问题,答案是肯定的,它就是 Composer

Composer

Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。

Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor
)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。

这种想法并不新鲜,Composer 受到了 node's npm 和 ruby's bundler 的强烈启发。而当时 PHP 下并没有类似的工具。

Composer 官网
Composer 中文文档

安装
curl -sS https://getcomposer.org/installer | sudo php

或者直接下载 phar 最新的文件

如果你需要全局使用它,你可以将它加入到环境变量 PATH 中:

mv composer.phar /usr/local/bin/composer

下载安装即可

小实践

这里我们结合系列文章中内容,对之前项目中引入的类文件内容进行调整,通过 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 目录:

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 自动加载实现了依赖管理。

上一篇下一篇

猜你喜欢

热点阅读