composer的配置文件及用法

一、几个概念(命名空间,PSR,Composer,Packagist)

简单来说,命名空间是一种封装事务的方法,就像在文件系统中使用目录结构来管理文件,php5.3以后就开始使用命名空间来优雅的管理代码(类、函数、常量)。PSR是PHP Standards Recommendation的简称,PSR-4规范了如何指定文件路径从而自动加载类定义,同时规范了自动加载文件的位置。Composer只是根据这二者开发了一个代码自动加载器,Composer本质上就是将Github上的代码下载到本地。它基于项目进行管理,默认不会在全局安装任何东西。依赖管理而不是包管理。它有一个配置文件composer.json,在composer.json文件中声明第三方包依赖,composer会去找到并下载安装它们,文件会下载安装到项目下的./vendor目录,同时根据参数生成用于载入第三方软件的autoload文件。

Packagist是Composer主要的一个包信息存储库,包开发者将具体代码托管到Github上,将包信息提交到Packagist上,这样使用者就可以通过Composer去使用。具体来说,Composer根据本地定义的composer.json信息去查询Packagist,Packagist根据Composer.json/Package.json信息解析,最终对应到github仓库,Composer最终下载代码的时候还要依赖于Github仓库上的Composer.json,这里涉及到三种类型的composer.json,含义是不一样的。

Composer和Packagist紧密合作,如果你告诉Composer想要使用 guzzlehttp/guzzle 组件,Composer会从Packagist中获取 guzzlehttp/guzzle 组件,找到这个组件的仓库地址,确定要使用哪个版本,还能找出这个组件的依赖,然后把 guzzlehttp/guzzle 组件及其依赖下载到你的项目中。

此外,Composer会为项目中的所有PHP组件自动生成符合PSR标准的自动加载器,有效地抽象了 依赖管理自动加载

二、三个命令

composer install命令:

  1. composer会根据本地composer.json文件中的配置来安装包,将下载的包放入项目下的vendor目录下(可在composer.json中配置),
  2. 同时将安装时候的包版本信息放入到composer.lock,以便锁定版本.其实在install的时候,假如发现composer.lock版本和目前vendor目录下的代码版本是一致的,则Composer会什么也不做,composer.lock的目的就是让你安心在目前这个版本下工作,而不获取最新版本的包,
  3. Composer还会为项目中的所有PHP组件(需要在composer.json文件中手动定义)自动生成符合PSR标准的自动加载器

composer update命令:下载最新版本的组件并更新 composer.lock
composer require命令:手动安装指定包到项目vendor目录下
composer dump-autoload命令:修改配置文件后重新加载

三、配置文件

1.定义包依赖,安装前需要检查是否已经安装的软件包列表,指定的包会全被安装:

	"require": {
		"monolog/monolog": "1.0.*",
		"php": ">=5.3.12",
		"ext-curl": "*",
		"ext-gd": "*",
		"ext-iconv": "*",
		"ext-json": "*",
		"ext-mcrypt": "*",
		"ext-zlib": "*",
		"ext-zip": "*",
	}

例如:使用composer require medz/emoji-format命令手动安装指定第三方包,安装成功后会发现require中多了一项"medz/emoji-format": "^1.0"。

这里声明第三方包依赖,composer会去找到并下载安装它们,文件会默认下载安装到项目下的./vendor目录,同时根据参数生成用于载入第三方软件的autoload文件。需要在项目的入口文件中加入:

require_once __DIR__.'/vendor/autoload.php';

引用vendor/autoload.php这个文件也将返回 autoloader 的实例,你可以将包含调用的返回值存储在变量中,并添加更多的命名空间:

$loader = require 'vendor/autoload.php';
$loader->add('Acme\\Test\\', __DIR__);

2.也可以在配置文件中指定安装依赖的根目录

    {
        "config": {
        "vendor-dir": "src/Vendor/"
        }
    }

3.定义项目中一个从命名空间到目录的映射:

"autoload": {
    "psr-4": {"Acme\\": "src/"}
}

此时 src 会在你项目的根目录,与 vendor 文件夹同级。例如 src/Foo.php 文件应该包含 Acme\Foo 类。

按照PSR-4的规则,当试图自动加载 "Acme\\Bar\\Baz" 这个class时,会去寻找 "src/Bar/Baz.php" 这个文件,如果它存在则进行加载。注意, "Acme\\"并没有出现在文件路径中,这是与PSR-0不同的一点,如果PSR-0有此配置,那么会去寻找"src/Acme/Bar/Baz.php"这个文件。

最后,psr-4的配置换被转换成namespace为key,dir path为value的Map的形式,写入生成的 vendor/composer/autoload_psr4.php 文件之中,psr-0则会写入到文件vendor/composer/autoload_namespaces.php中。

除了 PSR-4 自动加载,classmap 也是支持的。你可以用 'classmap' 来指定加载自定义的、不遵循 PSR-0/4 规范的类库。指定它们的目录就能够准确搜索到类文件:

"autoload": {
	"classmap": ["src/", "lib/", "Something.php"]
}

这里的配置最后会将map写入vendor/composer/autoload_classmap.php文件中

如果你想要明确的指定,在每次请求时都要载入某些文件,那么你可以使用 'files':

"autoload": {
	"files": ["src/MyLibrary/functions.php"]
}

最后它会生成一个array,包含这些配置中指定的files,再写入新生成的vendor/composer/autoload_files.php文件中。

修改了这些配置后,可以使用命令composer dump-autoload,更新composer在内存中维护的命名空间和class文件路径对应关系的字典。

4.一个包本质上就是一个包含东西的目录。通常情况下它存储 PHP 代码,但在理论上它可以是任何东西。包的元数据包括:名称、版本号、dist 和 source,用dist指向已经发行的稳定版本,用source指向源代码仓库。资源库是包的来源,是一个 packages/versions 的列表。可以指定多个资源库,composer会查找所有资源库去找到需要的资源包。资源库的定义仅可用于“root 包”,而在你依赖的包中定义的资源库将不会被加载。

"repositories": [
    {
		"type": "vcs",
		"url": "https://github.com/ywdblog/phpcomposer"
	}
]

四、完整示例

composer.json

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "medz/vendor-pack-pinyin",
                "version": "dev-master",
                "dist": {
                    "url": "https://github.com/jifei/Pinyin/archive/master.zip",
                    "type": "zip"
                },
                "autoload": {
                    "classmap": ["Pinyin.php"]
                }
            }
        }
    ],
    "require": {
        "php": ">=5.3.12",
        "ext-json": "*",
        "medz/vendor-pack-pinyin": "@dev",
        "medz/emoji-format": "^1.0",
        "illuminate/database": "4.1.*"
    },
    "require-dev": {
        "friendsofphp/php-cs-fixer": "^1.11"
    },
    "config": {
        "vendor-dir": "src/Vendor/",
        "preferred-install": "dist"
    },
    "autoload": {
        "files": [
            "src/functions.inc.php"
        ],
        "classmap": [
            "src/Think.class.php"
        ],
        "psr-4": {
            "TP\\": "src/",
            "TP\\Model\\": "src/Models/",
        }
    },
}

入口文件index.php

<?php

// 载入composer的autoload文件
$file = __DIR__ . '/vendor/autoload.php';
$file = dirname(__FILE__).'/Vendor/autoload.php';
if (!file_exists($file)) {//检查composer是否安装,没有的话给出安装提示
    echo '<pre>';
    echo 'You must set up the project dependencies, run the following commands:', PHP_EOL,
         'curl -sS https://getcomposer.org/installer | php', PHP_EOL,
         'php composer.phar install', PHP_EOL
    ;
    echo '</pre>';
    exit;
} 
$loader = include $file;

//数据库连接配置
$database = [
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'test',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
];

//使用第三方的插件Eloquent orm,使用前需要先初始化
use Illuminate\Container\Container;  
use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
// 创建链接
$capsule->addConnection($database);
// 设置全局静态可访问
$capsule->setAsGlobal();
// 启动Eloquent
$capsule->bootEloquent();

/*其它业务代码*/

 

转载于:https://my.oschina.net/codespring/blog/852063

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值