PHP|組件、依賴管理和自動加載

組件

PHP組件目錄Packagistphp

https://packagist.orggit

使用組件

Packagist是查找PHP組件的地方,Composer是安裝PHP組件的工具github

https://getcomposer.org編程

安裝:json

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

使用curl下載Composer的安裝腳本,使用PHP執行安裝腳本,最後在當前目錄中建立composer.phar文件bash

有用的一條命令:app

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

把composer編程可執行的二進制文件:curl

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建立的自動加載器:

<?php
require 'vendor/autoload.php';

Composer建立的自動加載器就是名爲autoload.php的文件。這樣咱們就能夠在項目中實例化任何組件。

舉個例子:編寫scan.php

經過Guzzle和CSV組件編寫scan.php腳本。

<?php
require 'vendor/autoload.php';

$client = new \GuzzleHttp\Client();
$csv = new \League\Csv\Reader($argv[1]);
foreach ($csv as $csvRow) {
    try {
        $httpResponse = $client->options($csvRow[0]);
        
        if ($httpResponse->getStatusCode >= 400) {
            throw new \Exception();
        }
    } catch (\Exception $e) {
        echo $csvRow[0] . PHP_EOL;
    }
}

實例化組件時,這裏使用了\GuzzleHttp & \League\Csv命名空間。

執行:

php scan.php urls.csv

使用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": {
            "namespace\\subnamespace\\": "src/"
        }
    }
}

其中:

support的對象是建議安裝的組件,以防與其餘組件合做時須要。

autoload: 在PSR-4中,咱們要把組件的命名空間前綴與相對組件根目錄的文件系統路徑對應起來。

若是實例化虛構的namespace\subnamespace\Url\Scanner類,Composer會自動加載src/Url/Scanner.php文件。

Demo: http://getcomposer.org

README

  • 組件的名稱和描述

  • 安裝說明

  • 用法說明

  • 測試說明

  • 貢獻方式說明

  • 支持資源

  • 做者信息

  • 軟件許可證

實現組件

Demo

<?php
namespace namespace\subnamespace\Url;

class Scanner
{
    protected $urls;
    
    /** @var \GuzzleHttp\Client */
    protected $httpClient;
    
    public function __construct(array $urls)
    {
        $this->urls = $urls;
        $this->httpClient = new \GuzzleHttp\Client();
    }
    
    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();
    }
}

提交

  1. 提交代碼到本身的github上

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

  3. 能夠經過設置鉤子,每次更新組件的repo時,通知Packagist: https://packagist.org/profile/

  4. 使用: composer require vendor/package

<?php
require 'vendor/autoload.php';
$urls = [
    'http://php.net',
    'http://apple.com'
];

$scanner = new \namespace\subnamespace\Url\Scanner($urls);
print_r($scanner->getInvalidUrls());

參考

  1. Modern PHP

相關文章
相關標籤/搜索