一、几个概念(命名空间,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命令:
- composer会根据本地composer.json文件中的配置来安装包,将下载的包放入项目下的vendor目录下(可在composer.json中配置),
- 同时将安装时候的包版本信息放入到composer.lock,以便锁定版本.其实在install的时候,假如发现composer.lock版本和目前vendor目录下的代码版本是一致的,则Composer会什么也不做,composer.lock的目的就是让你安心在目前这个版本下工作,而不获取最新版本的包,
- 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
'; 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 ''; 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();/*其它业务代码*/