资讯专栏INFORMATION COLUMN

PHP|组件、依赖管理和自动加载

XBaron / 3406人阅读

摘要:如果需要下载新版组件,需要使用自动加载组件我们只需在文件的顶部使用函数导入创建的自动加载器创建的自动加载器就是名为的文件。如果实例化虚构的类,会自动加载文件。

组件

PHP组件目录Packagist

https://packagist.org

使用组件

Packagist是查找PHP组件的地方,Composer是安装PHP组件的工具

https://getcomposer.org

安装:

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

使用curl下载Composer的安装脚本,使用PHP执行安装脚本,最后在当前目录中创建composer.phar文件

有用的一条命令:

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

把composer编程可执行的二进制文件:

sudo chmod +x /usr/local/bin/composer

~/.bash_profile中添加下面这行代码:

PATH=/usr/local/bin:$PATH

命令行中执行composer. Bingo

安装组件

进入项目的最顶层目录,然后为每个PHP组件执行一次:

composer require vendor/package

这个命令可以安装这个组件的最新稳定版。

执行命令的接轨哦可以在项目最顶层目录中新建或更新的composer.json文件中查看。执行这个命令后还会创建一个composer.lock文件。

composer.lock

这个文件会列出项目使用的所有PHP组件,以及组件的具体版本号。这其实是锁定了项目,让项目只能使用具体版本的PHP组件。

Why? 如果有composer.lock文件,Composer会下载这个文件中列出的具体版本,而不管Packagist中可用的最新八本是多少。所以,应该把composer.lock文件纳入版本控制,让大家使用相同版本的PHP组件。

composer.lock有个缺点,composer install命令不会安装避其中列出的版本号新的版本。如果需要下载新版组件,需要使用

composer update
自动加载PHP组件

我们只需在scan.php文件的顶部使用require函数导入Composer创建的自动加载器:


Composer创建的自动加载器就是名为autoload.php的文件。这样我们就可以在项目中实例化任何组件。

举个例子:编写scan.php

通过Guzzle和CSV组件编写scan.php脚本。

options($csvRow[0]);
        
        if ($httpResponse->getStatusCode >= 400) {
            throw new Exception();
        }
    } catch (Exception $e) {
        echo $csvRow[0] . PHP_EOL;
    }
}

实例化组件时,这里使用了GuzzleHttp & LeagueCsv命名空间。

执行:

php scan.php urls.csv

使用PHP编写命令行脚本

http://php.net/manual/wrappers.php.php

http://php.net/manual/reserved.variables.argv.php

http://php.net/manual/reserved.variables.argc.php

Composer和私有库

Composer可以管理放在需要认证的仓库中的私有组件。

执行composer install or composer update时,如果需要认证,Composer会提醒你。

Composer还会询问你是否把仓库的认证保存在本地的auth.json文件中。

auth.json:

{
    "http-basic": {
        "example.org": {
            "username": "",
            "password": ""
        }
    }
}

如果不想等Composer向你询问认证凭据,使用下述命令:

composer config http-basic.example.org your-username your-password

解释一下:http-basic告诉Composer,我们要为指定的域名天假认证信息,example.org是主机名。这个命令会在当前项目中的auth.json文件里保存凭据。

创建组件 文件系统的组织方式
src/
tests/
composer.json
README.md
CONTRIBUTING.md
LICENSE
CHANGELOG.md

Demo: https://github.com/thephpleague/skeleton

composer.json

举个例子:

{
    "name": "vendor/package",
    "description": "",
    "keywords": ["", ""],
    "homepage": "http://example.org",
    "license": "MIT",
    "authors": [
        {
            "name": "",
            "homepage": "",
            "role": "Developer"
        }
    ],
    "support": {
        "email": ""
    },
    "require": {
        "php": ">=5.4.0",
        "vendorX/packageX": "~5.0"
    },
    "require-dev": {
        "vendorY/packageY": "~4.3"
    },
    "suggest": {
        "league/csv": "~6.0"
    },
    "autoload": {
        "psr-4": {
            "namespacesubnamespace": "src/"
        }
    }
}

其中:

support的对象是建议安装的组件,以防与其他组件合作时需要。

autoload: 在PSR-4中,我们要把组件的命名空间前缀与相对组件根目录的文件系统路径对应起来。

如果实例化虚构的namespacesubnamespaceUrlScanner类,Composer会自动加载src/Url/Scanner.php文件。

Demo: http://getcomposer.org

README

组件的名称和描述

安装说明

用法说明

测试说明

贡献方式说明

支持资源

作者信息

软件许可证

实现组件

Demo

urls = $urls;
        $this->httpClient = new GuzzleHttpClient();
    }
    
    public function getInvalidUrls()
    {
        $invalidUrls = [];
        foreach ($this->urls as $url) {
            try {
                $statusCode = $this->getStatusCodeForUrl($url);
            } catch (Exception $e) {
                $statusCode = 500;
            }
            
            if ($statusCode >= 400) {
                array_push($invalidUrls, [
                    "url" => $url,
                    "status" => $statusCode
                ]);
            }
        }
        
        return $invalidUrls;
    }
    
    protected function getStatusCodeForUrl($url)
    {
        $httpResponse = $this->httpClient->options($url);
        
        return $httpResponse->getStatusCode();
    }
}
提交

提交代码到自己的github上

提交组件到 https://packagist.org/packages/submit

可以通过设置钩子,每次更新组件的repo时,通知Packagist: https://packagist.org/profile/

使用: composer require vendor/package

getInvalidUrls());

参考

Modern PHP

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21647.html

相关文章

  • php管理依赖关系工具composer学习笔记

    摘要:首先支持下黄老师的视频网站转型这篇的学习笔记也是根据他的视频教程写的,一共十集,讲解的很简单感兴趣的同志们可以上他视频网站购买视频,网站地址放在文末我的博客作用自动安装所需要的模块,自动加载管理项目,发布到网上上去是默认的加载组件地址安装下 首先支持下黄老师的视频网站转型这篇composer的学习笔记也是根据他的视频教程写的,一共十集,讲解的很简单感兴趣的同志们可以上他视频网站购买视频...

    CoyPan 评论0 收藏0
  • Swoft| Swoft 框架组件化改造

    摘要:框架组件化改造框架从单体应用到组件化改造的架构升级之路经过一年多的开发框架功能越来越完善也越来越复杂初创时期的单体应用已经无法支撑项目的快速发展于是开发组在年前为版制定了组件化改造的重构方案内容速览组件化原理包管理基础知识组件化方案来 date: 2018-3-21 13:22:16title: Swoft| Swoft 框架组件化改造description: Swoft 框架从单体应...

    desdik 评论0 收藏0
  • 【Laravel】Laravel 框架关键技术解析·读书笔记(一)

    摘要:判断是否存在构造函数,不存在直接实例化,存在则通过来获取输入函数,并有相应的方法解决依赖参数问题,实现依赖注入。 Laravel 框架关键技术解析·读书笔记(一) 第一章 入口文件 请求访问的入口文件,主要完成几部分工作,分别是: 自动加载函数的添加 服务器实例化与服务注册 路由加载 请求实例化与路由分发 相应生成与发送 其中,自动加载函数用于包含引用文件,改文件是composer...

    CocoaChina 评论0 收藏0
  • PHPer面试指南-Laravel 篇

    摘要:简述的生命周期采用了单一入口模式,应用的所有请求入口都是文件。分发请求一旦应用完成引导和所有服务提供者都注册完成,将会移交给路由进行分发。此外,由于对动态方法的独特用法,也使测试起来非常容易。 本书的 GitHub 地址:https://github.com/todayqq/PH... Laravel 作为现在最流行的 PHP 框架,其中的知识较多,所以单独拿出来写一篇。 简述 La...

    alaege 评论0 收藏0
  • 2017年PHP程序员未来路在何方

    摘要:目前来看等语言还难以企及和。作为一个资深的开发者,在技术上给各位程序十点未来的建议,希望对大家有所帮助。开发者应当学习掌握规范,在开发程序时应当尽量遵循规范。程序员除了写后台程序之外,还有很大一部分工作在展现层,和浏览器前端打交道。 PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js 、 GO 、 Pytho...

    william 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<