最佳实践系列:漫谈PHP组件、框架、Composer那些事
优秀的PHP组件具备以下特性:作用单一:专注于解决一个问题,而且使用简单的接口封装功能小型:小巧玲珑,只包含解决某个问题所需的最少代码合作:PHP组件之间可以良好合作,组合在一起实现大型项目测试良好:本身提供测试,而且有充足的测试覆盖度文档完善:应该提供完善的文档,能让开发者轻易安装、理解和使用
PS:这句话也适用于语言之争,用正确的语言做正确的事,没事少BB,这是学院君对语言之争的态度和立场。安装组件
选择框架时,我们看中的是框架的未来,但是谁又能保证某个框架始终是完成某项工作最好的工具呢?存在多年的大型项目必须有好的表现,而且要时刻做好调整,如果选错了PHP框架,可能无法做到这一点。较旧的PHP框架可能由于缺乏社区支持而变慢或过时,这些旧框架通常使用过程式代码编写,而没有使用新式的面向对象代码以及PHP的一些新特性,总之,决定是否使用PHP框架时,要考虑的事情很多。
那我们应该使用组件还是框架呢?答案是,使用正确的工具做正确的事,如果能通过一些PHP组件快速实现小型项目,那就使用组件,如果有多个团队成员开发大型项目,而且能从框架提供的约定准则和结构中受益,那就使用框架(如果是在纠结使用什么框架,那么选择Laravel吧,它不会让你失望),使用框架能够引导并加速项目的开发。
composer.lock文件中会列出项目使用的所有PHP组件,以及组件的具体版本号,这其实是锁定了项目,让项目只能使用具体版本的PHP组件。这样的好处是,composer会下载这个文件中列出的具体版本,而不管Packagist中可用的最新版本是多少,你应该把composer.lock文件纳入版本控制,这样让团队成员使用的PHP版本和你一样,如果本地开发和服务器使用的PHP组件版本相同,可以尽量降低由组件版本不同导致的bug。如果确实要下载最新版本的组件并更新,可以使用composer update命令。自动加载接下来我们来编写应用代码,在根目录下创建一个scan.php文件,然后在该文件顶部使用Composer创建的自动加载器其实就是个名为的文件,保存在vendor目录中,Composer下载各个PHP组件时,会检查每个组件的composer.json文件,确定如何加载该组件,得到这个信息后,Composer会在本地为该组件创建一个符合PSR标准的自动加载器。这样我们就可以实例化项目中的任何PHP组件,这些组件按需自动加载。编写代码下面我们正式使用Guzzle和CSV组件编写scan.phpcomposer自动加载器 require 'vendor/autoload.php'; //实例Guzzle Http客户端 $client = new GuzzleHttp\Client; //打开并迭代处理CSV $csv = League\Csv\Reader::createFromPath($argv[1]); foreach ($csv as $csvRow) { try { //发送HTTP GET请求 $httpResponse = $client-get($csvRow[0]); //检查HTTP响应的状态码 if($httpResponse-getStatusCode = 400) { throw new Exception; } } catch (Exception $e) { //把死链发给标准输出 echo $csvRow[0] . PHP_EOL; } }中添加一些URL,一行一个,而且至少有一个是死链:
开始之前,先看看哪些任务可以使用现有的PHP组件解决:我们需要一个可以迭代处理csv文件数据的组件,此外还要向csv文件中的每个URL发送HTTP请求,因此还需要一个可以发送HTTP请求并检查HTTP响应的组件。浏览Packagist后,我们找到和league/csv两个组件,前者用于处理HTTP消息,后者用于处理CSV数据。下面我们在项目最顶层运行如下命令:composer require guzzlehttp/guzzle composer require league/csvComposer会将依赖安装到根目录的vendor目录下,安装完成后,会在根目录下生成composer.json和
庆幸的是,Laravel在这些担忧方面表现良好,因此才能在众多PHP框架中脱颖而出,从某种意义上来说,Laravel也是个基于组件开发的框架(核心组件是自身的Illuminate库,功能实现上则大量依赖第三方组件),相比Symfony而言,上手又比较简单,所以兼具了扩展性和易用性。但是,Laravel也存在一些不足,比如Laravel自身的组件不能轻易解耦,用于Laravel框架之外(但是相信这种状况会有好转,比如其数据库和队列组件就可以解耦出去)。综合来看,Laravel仍是一个出色的框架,能帮组我们快速创建强大的应用。