目录
【转】Composer入门,composer入门
配置文件
依赖管理
require-dev
自动加载
首页 php教程 php手册 【转】Composer入门,composer入门

【转】Composer入门,composer入门

Jun 13, 2016 am 08:45 AM
composer java 入门

【转】Composer入门,composer入门

Java有Maven, Node.js有npm, ROR有gem, 这些语言的程序员在开心地使用包管理工具加速开发效率时,PHPer们还在复制粘贴的黑暗中。PHP在Composer之前,包管理的历史不堪回首。

在相当长的一段时间内,如果应用依赖于第三方库,PHPer需要拷贝这些库的源代码, 或者通过PEAR、PECL安装。如果第三方库又依赖于更多的第三方库,那么很快就会进入依赖的黑洞。直到Composer出现,PHPer们看到了属于PHP的包管理的曙光。

下面将以创建一个电商网站为例,介绍Composer的使用方法。

配置文件

在我们开始一个项目的时候,首先会给项目取一个名字,我们暂且叫丝绸之路吧,代号silk。首先要写一个Composer的配置文件,来描述项目,为此,在项目的根目录下,建立文件名为composer.json的配置文件。内容如下:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
<span class="hljs-expression">{
<span class="hljs-string">"name":             <span class="hljs-string">"meta/silk",
<span class="hljs-string">"description":      <span class="hljs-string">"another e-commerce website",
<span class="hljs-string">"keywords":         [<span class="hljs-string">"silk", <span class="hljs-string">"online shop", <span class="hljs-string">"good"],
<span class="hljs-string">"homepage":         <span class="hljs-string">"http://www.xxx.com ",
<span class="hljs-string">"time":             <span class="hljs-string">"2014-12-30",
<span class="hljs-string">"license":          <span class="hljs-string">"MIT",
<span class="hljs-string">"authors": [
    {
        <span class="hljs-string">"name":         <span class="hljs-string">"Elvis Lim",
        <span class="hljs-string">"email":        <span class="hljs-string">"elvis@xxx.com",
        <span class="hljs-string">"homepage":     <span class="hljs-string">"http://www.xxx.com",
        <span class="hljs-string">"role":         <span class="hljs-string">"Engineer"
    }<span class="xml">
]}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
登录后复制

如果您熟悉JSON格式,那么上面这段内容不言而喻。事实上,这些键值对都是可选的。也就是说,可以都不写。但是如果要把项目打包成公共包发布,那么这些还是需要写上的,给你的包取个名字总不为过。让我们来过一下这些键值对的意义吧。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"name":             "meta/silk",
</span></code>
登录后复制

name, 表示包的名称。如果你经常在Github上混,那这个值的表达方式一定非常熟悉啦。解释下,通常包名包含两部分,并且以 / 分隔。斜杆前面部分,代表包的所有者。目前大部分的包作者都喜欢用Github的用户名作为这部分的值。斜杆后面部分代表包的名称。尽量保持简单和有意义 些,便于记忆和传播。大部分情况下,很多人会用Github的代码库名称来命名,当然,这种情况下,代码要存在Github比较有意义。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"description":      "another e-commerce website",
</span></code>
登录后复制

应用简介,这部分尽量简洁介绍下项目,别长篇大论。如果确实有很多话要说,那么可以写在README.md文件里。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"keywords":         ["silk", "online shop", "good"],
</span></code>
登录后复制

关键词的值是一个字符串数组,在发布成公用库的是时候,作为元数据信息,有利于包的搜索和发现。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"homepage":         "http://www.xxx.com ",
</span></code>
登录后复制

主页,可以放你想放的任何页面地址。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"license": "MIT",
</span></code>
登录后复制

如果你决定将包公开发布,那么记得选择一个合适的许可证。这样别的程序员在引用包的时候,通过查看许可证,确保没有法律上的问题。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
 "authors":[{}]
</span></code>
登录后复制

作者字段可以包含一个对象数组,也就是说可以提供多个作者信息。

目前为止,都是关于包本身的信息描述。作为一个电商网站,能够发送电子邮件、导出订单到Excel表是基本需求,这个时候自然想到了使用现有的库来 实现这些功能。要获取这些库,最简单的方式是,搜索下这些库,找到下载地址,下载个zip包,然后解压到相应目录下,根据文档引入相应的文件。使用 Composer,可以更加自动和优雅地完成这个过程,这就是Composer的依赖管理。

依赖管理

在composer.json文件里增加一个新的字段:require。这个字段的值是一个对象,同样以键值对的形式构成。以上述提到的两个依赖位置,写成composer管理的方式如下:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
&ldquo;require&rdquo;: <span class="hljs-expression">{
<span class="hljs-string">"swiftmailer/swiftmailer": 5<span class="hljs-variable">.3<span class="hljs-variable">.*@<span class="hljs-variable">dev,
<span class="hljs-string">"phpoffice/phpexcel": <span class="hljs-string">"dev-master"
}</span></span></span></span></span></span></span></span></span></code>
登录后复制

以swiftmailer为例,swiftmailer/swiftmailer 代表的是包名称,5.3.@dev , 是版本信息。合起来的意思就是说,我们将要开发的应用,依赖于swiftmailer的5.3.版本。其中:

5.3.*表示,可以使用5.3.1版本,也可以使用5.3.2版本,composer在获取的时候,将寻找5.3版本下最新的版本。版本号支持一 些更加宽泛的约束,比如>=1.0, >=1.0, <2.0,更加具体的信息可以查看:http://docs.phpcomposer.com/01-basic-usage.md#The- require-Key

@dev表示可以获取开发版本。通常,开发版本意味非稳定版本,很可能存在bug。稳定性标签可以作用于特定的依赖项,也可以作用于全局。

作用特定依赖项:默认情况下,composer只会获取稳定版本,如果这个例子我们不加@dev约束,而5.3.*版本都是开发版本,那么在获取的时候composer就会报错,指出改版本不符合要求。如果确定这个开发版本没有问题,那么就可以通过加@dev ,让Composer获取这个开发版本。

全局稳定性设置:通过设置minimum-stability的值,来告诉Composer当前开发的项目的依赖要求的包的全局稳定性级别,它的值包括:dev、alpha、beta、RC、stable,stable是默认值。

至此,两个依赖添加完毕,我们可以运行下Composer包更新命令,看看效果啦。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: shell -->
composer install
</span></code>
登录后复制
登录后复制

成功运行完毕,会在根目录下发现vendor文件夹,里面包含了刚刚我们列出来的两个包文件代码。

require-dev

有时候,我们会发现,有些包依赖只会在开发过程中使用,正式发布的程序不需要这些包,这个时候,就需要用到另外一个键,即require-dev。例如,我们想用codeception进行单元测试,那么就可以通过require-dev引入这个开发环境下的依赖包:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
&ldquo;require-dev&rdquo;: <span class="hljs-expression">{
<span class="hljs-string">"codeception/codeception": <span class="hljs-string">"2.0.0 "
}</span></span></span></span></span></code>
登录后复制

加了这个依赖后,再运行下命令看看效果。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: shell -->
composer install
</span></code>
登录后复制
登录后复制

自动加载

自此,composer已经帮我们把需要的库文件下载下来啦,接下去想到的就是如何引用这些库文件。最简单的方式就是require或者 include,但这就不够高大上了啊,需要花时间去库文件里查看需要引入哪些文件,费事而且容易出错。好在composer可以帮我们解决这个问题。那 就是autoload。

在运行完composer install命令后,怎么调用PHPExcel库呢?很简单,只要引入vendor目录下的autoload.php文件就可以了。可以在根目录下,建一个index.php文件,加入一下内容:

<code class="hljs php">
<span class="hljs-keyword">include &ldquo;vendor/autoload.php&rdquo;
<span class="hljs-variable">$excel = <span class="hljs-keyword">new PHPExcel();
var_dump(<span class="hljs-variable">$excel);
</span></span></span></span></code>
登录后复制

用浏览器访问一下这个页面,就会发现PHPExcel对象已经被成功创建啦,是不是很方便?

其实到目前为止,我们并没用在composer.json文件里加入autoload字段,那么什么时候需要加入呢? 那就是当我们想让composer帮我们自动加载我们自己定义的类的时候。例如,我们自己写了个订单管理类,取名OrderManager,放在lib目 录下的OrderManager.php文件里。内容如下:

<code class="hljs php">
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">OrderManager
{
    <span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">test<span class="hljs-params">()
    {
        <span class="hljs-keyword">echo <span class="hljs-string">"hello";
    }
}
</span></span></span></span></span></span></span></span></span></span></code>
登录后复制

那么如何让composer帮我们自动加载这个类呢? 在composer.json里加入下面的内容:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
&ldquo;autoload&rdquo;:<span class="hljs-expression">{
    <span class="hljs-string">"files":[<span class="hljs-string">"lib/OrderManager.php"]
}</span></span></span></span></span></code>
登录后复制

files键对应的值是一个数组,数组元素是文件的路径,路径是相对于应用的根目录。加上上述内容后,运行命令:

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
composer dump-autoload
</span></code>
登录后复制

让composer重建自动加载的信息,完成之后,就可以在index.php里调用OrderManager类啦。

通过文件引入的方法虽然直观,但是很费劲,每个文件都得引入一次,实在不是好的解决办法。有没有更好的办法呢?尝试将autoload的值改成:

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
 "classmap":["lib"]
</span></code>
登录后复制

再此运行composer dump-autoload,尝试调用,依然能够成功创建OrderManager类。其实,classmap通过建立类到文件的对应关系,当程序需要 OrderManager类时,compoer的自动加载类通过查找OrderManager类所在的文件,然后再将改文件include进来。因此,这 又导致了一个问题,那就是每加一个新类,就需要运行一次composer dump-autoload来创建类到文件到对应关系,比files方法虽然好一点,但是还是很不够舒爽啊!于是,PSR-0出场了。先了解下什么是 PSR-0。

FIG组织制定的一组PHP相关规范,简称PSR,其中

PSR-0自动加载
PSR-1基本代码规范
PSR-2代码样式
PSR-3日志接口
PSR-4 自动加载

目前就这五个规范,乍一看,PSR-0和PSR-4是重复了,实际上,在功能上确实有所重复。区别在于PSR-4的规范比较干净,去除了兼容PHP 5.3以前版本的内容,有一点PSR-0升级版的感觉。当然,PSR-4也不是要完全替代PSR-0,而是在必要的时候补充PSR-0——当然,如果你愿 意,PSR-4也可以替代PSR-0。PSR-4可以和包括PSR-0在内的其他自动加载机制共同使用。

PSR-0规范的具体内容见:https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-0.md
PSR-4规范的具体内容见:https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-4-autoloader.md

简而言之,就是希望通过一组约定的目录,文件名,类名定义方式,来实现快速通过类查找到文件,然后包含进来,实现自动加载。
PSR-4和PSR-0最大的区别是对下划线(underscore)的定义不同。PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔符。

不管是PSR-0还是PSR-4,都要求有个命名空间,所以我们需要对OrderManager类进行一些小的修改,加上命名空间:

<code class="hljs php">
<span class="hljs-keyword">namespace <span class="hljs-title">SilkLib;
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">OrderManager
{
    <span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">test<span class="hljs-params">()
    {
        <span class="hljs-keyword">echo <span class="hljs-string">"hello";
    }
 }
</span></span></span></span></span></span></span></span></span></span></span></span></code>
登录后复制

同时,文件夹的结构也要修改成:应用根目录\lib\SilkLib\OrderManager.php

然后修改composer.json里的autoload部分如下:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
"autoload":<span class="hljs-expression">{
    <span class="hljs-string">"psr-0":{
        <span class="hljs-string">"SilkLib":<span class="hljs-string">"lib/"
    }<span class="xml">
}
</span></span></span></span></span></span></span></code>
登录后复制

这里需要注意的是,SlikLib是命名空间,lib是目录名,他们的组合告诉composer,文件搜索是在:lib/SilkLib/ 目录下,而不是在 SilkLib/lib 目录下,这一点要特别注意,有点绕,容易弄错。

如果我们把命名空间改成 Slik\lib, 相应的目录结构要改成:应用根目录\lib\Silk\lib\OrderManager.php,autoload部分的写法相应的也要改成:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
"autoload":<span class="hljs-expression">{
    <span class="hljs-string">"psr-0":{
        <span class="hljs-string">"Silk\\lib":<span class="hljs-string">"lib/"
    }<span class="xml">
}
</span></span></span></span></span></span></span></code>
登录后复制

注意Silk\lib是双斜杆。好了,那我们试试再加一个类,然后不用运行composer dump-autoload命令,看看新类是否能加载上。在lib目录下,新增一个ShipManager.php文件,内容如下:

<code class="hljs php">
<span class="hljs-keyword">namespace <span class="hljs-title">Silk\<span class="hljs-title">lib;
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">ShipManager
{
    <span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">test<span class="hljs-params">()
    {
        <span class="hljs-keyword">echo <span class="hljs-string">'hello ship class';
    }
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></code>
登录后复制

尝试在index.php文件中调用:

<code class="hljs lasso">
<span class="hljs-variable">$orderMgr <span class="hljs-subst">= <span class="hljs-literal">new Silk<span class="hljs-subst">\lib<span class="hljs-subst">\OrderManager();
<span class="hljs-variable">$orderMgr<span class="hljs-subst">->test();
<span class="hljs-variable">$shipMgr <span class="hljs-subst">= <span class="hljs-literal">new Silk<span class="hljs-subst">\lib<span class="hljs-subst">\ShipManager();
<span class="hljs-variable">$shipMgr<span class="hljs-subst">->test();
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
登录后复制

运行成功,说明使用psr-0规范进行自动加载,比classmap更加方便。下面试试psr-4方式,整理下目录结构,改成:应用根目录\lib\OrderManager.php,修改命名空间为Silk, 修改autoload部分为:

<code class="hljs 1c">
<span class="hljs-string">"autoload":{
    <span class="hljs-string">"psr-4":{
        <span class="hljs-string">"Silk":<span class="hljs-string">"lib"
    }
}
</span></span></span></span></code>
登录后复制

尝试调用,发现报错Fatal error: Uncaught exception 'InvalidArgumentException' with message 'A non-empty PSR-4 prefix must end with a namespace separator. 提示要加上分隔符,那就加上吧:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
"autoload":<span class="hljs-expression">{
    <span class="hljs-string">"psr-4":{
        <span class="hljs-string">"Silk\\":<span class="hljs-string">"lib"
    }<span class="xml">
}
</span></span></span></span></span></span></span></code>
登录后复制

再次composer dump-autoload,运行测试,OK通过!

掌握require和autoload部分,其实就算Compoer入门啦,在详细的内容,可以通过查看composer文档来了解。Happy Coding!

原文转于:http://my.oschina.net/u/248080/blog/359008

感谢原著

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1667
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1255
24
使用 Composer 解决推荐系统的困境:andres-montanez/recommendations-bundle 的实践 使用 Composer 解决推荐系统的困境:andres-montanez/recommendations-bundle 的实践 Apr 18, 2025 am 11:48 AM

在开发一个电商网站时,我遇到了一个棘手的问题:如何为用户提供个性化的商品推荐。最初,我尝试了一些简单的推荐算法,但效果并不理想,用户的满意度也因此受到影响。为了提升推荐系统的精度和效率,我决定采用更专业的解决方案。最终,我通过Composer安装了andres-montanez/recommendations-bundle,这不仅解决了我的问题,还大大提升了推荐系统的性能。可以通过一下地址学习composer:学习地址

laravel入门实例 laravel入门实例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

laravel框架安装方法 laravel框架安装方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了详细分步说明,指导读者如何轻松安装 Laravel 框架。Laravel 是一个功能强大的 PHP 框架,它 упростил 和加快了 web 应用程序的开发过程。本教程涵盖了从系统要求到配置数据库和设置路由等各个方面的安装过程。通过遵循这些步骤,读者可以快速高效地为他们的 Laravel 项目打下坚实的基础。

laravel怎么查看版本号 laravel查看版本号方法 laravel怎么查看版本号 laravel查看版本号方法 Apr 18, 2025 pm 01:00 PM

Laravel框架内置了多种方法来方便地查看其版本号,满足开发者的不同需求。本文将探讨这些方法,包括使用Composer命令行工具、访问.env文件或通过PHP代码获取版本信息。这些方法对于维护和管理Laravel应用程序的版本控制至关重要。

使用DICR/YII2-Google将Google API集成在YII2中 使用DICR/YII2-Google将Google API集成在YII2中 Apr 18, 2025 am 11:54 AM

vProcesserazrabotkiveb被固定,мнелостольностьстьс粹馏标д都LeavallySumballanceFriablanceFaumDoptoMatification,Čtookazalovnetakprosto,kakaožidal.posenesko

如何使用 Composer 简化邮件营销:DUWA.io 的应用实践 如何使用 Composer 简化邮件营销:DUWA.io 的应用实践 Apr 18, 2025 am 11:27 AM

在进行邮件营销活动时,我遇到了一个棘手的问题:如何高效地创建并发送HTML格式的邮件。传统的方法是手动编写代码并使用SMTP服务器发送邮件,但这不仅耗时,而且容易出错。在尝试了多种解决方案后,我发现了DUWA.io,这是一个简单易用的RESTAPI,能够帮助我快速创建和发送HTML邮件。为了进一步简化开发流程,我决定使用Composer来安装和管理DUWA.io的PHP库——captaindoe/duwa。

laravel8 的优化点 laravel8 的优化点 Apr 18, 2025 pm 12:24 PM

Laravel 8 针对性能优化提供了以下选项:缓存配置:使用 Redis 缓存驱动、缓存门面、缓存视图和页面片段。数据库优化:建立索引、使用查询范围、使用 Eloquent 关系。JavaScript 和 CSS 优化:使用版本控制、合并和缩小资产、使用 CDN。代码优化:使用 Composer 安装包、使用 Laravel 助手函数、遵循 PSR 标准。监控和分析:使用 Laravel Scout、使用 Telescope、监控应用程序指标。

laravel安装代码 laravel安装代码 Apr 18, 2025 pm 12:30 PM

要安装 Laravel,需依序进行以下步骤:安装 Composer(适用于 macOS/Linux 和 Windows)安装 Laravel 安装器创建新项目启动服务访问应用程序(网址:http://127.0.0.1:8000)设置数据库连接(如果需要)

See all articles