登入
首頁 所有文章 PHP PHP - Composer套件管理入門
長也   2018-09-08 14:04:53(1年前)    1251點閱   1喜歡  0收藏
PHP - Composer套件管理入門  

Composer - PHP套件管理工具

傳統上編寫PHP程式的時候,當我們需要利用自己編寫的類別或他人提供的套件,就必須使用include()、require()等函式來導入我們要使用的腳本;而近代一點的可能會使用自動載入(autoload)策略,如psr-4之類的自動載入標準。

而composer除了進行套件管理之外,也可以幫你自動載入所安裝的套件,當然也可以自動載入自己寫的腳本。

安裝

Windows 

https://getcomposer.org/download/ 到官方網站後,直接下載Composer-Setup.exe 安裝就好。

Ubuntu

先以curl下載composer腳本,以PHP執行腳本並在當前目錄建立composer.phar檔案,composer.phar是composer的執行檔案。

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

再將下載好的composer.phar移動至/usr/local/bin/comoposer

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

之後再以下列指令確保你的composer執行檔可被執行

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

最後在~/.bash_profile檔案中添加下行

PATH=/usr/local/bin:$PATH

之後在終端機輸入composer應該可以看到composer的命令列表

開始使用composer

當我們安裝好composer之後,就可以利用composer來安裝套件,在開始之前必須將專案引入composer,在專案目錄下執行這個指令

composer init

經過一些問答之後,專案就成為了一個composer專案,會在專案目錄看到composer.json檔案,並且可以開始安裝套件,但在開始前我們要知道一些東西

Packagist

https://packagist.org/  Packagist與composer有密切的關係,可以在上面尋找一些套件。

套件名稱

套件名稱以 "服務提供者/套件名稱" 方式表示,例如nesbot/carbon為例,nesbot就是套件的提供者,而carbon則為套件的名稱。

語意版本(SemVer)

總共有三個部分,包含了:主要版本號、次要版本號、補丁版本號,並以" . "區隔,目前大部分的php套件遵守此編排方式。

套件版本的選擇

一般情況我們不需要選擇套件的版本號,composer會選擇最穩定的版本來安裝。

開始安裝套件

以nesbot/carbon為例子,carbon是一個日期時間的套件,比起php內建的date()函式提供了更人性化的日期操作方式。

安裝套件大多數的情況下以composer require來取得套件

coomposer require nesbot/carbon

如果這是專案第一次安裝套件,可能會花費比較久的時間,安裝的同時composer會自動安裝相依套件。

完成套件安裝後,專案目錄會增加一個名為composer.lock的檔案,這個檔案紀錄了專案中套件的詳細版本資訊,而前面所產生的composer.json也會記錄專案中的套件資訊,但是版本號紀錄較為粗略。

vendor資料夾

除了產生一個composer.lock檔案之外,還會產生vendor資料夾,這個資料夾內放了安裝的套件及composer的自動載入檔案。

Install指令與Update指令的使用時機

Install 

剛接手一個新的專案時,需要安裝全部的套件(通常已經有composer.json檔案)

Update

(1)修改composer.json之後、(2)更新套件

使用已安裝的套件

composer的自動載入

在開始此用套件之前,必須先讓composer載入套件,不必一一載入,composer可以一次載入所有需要的套件。

require (__DIR__."/vendor/autoload.php");

namespace

記得開始使用套件前,要將套件的命名空間也一同載入,大多數的命名空間都和套件的目錄結構相同。

use Carbon\Carbon;

我使用這個套件做一個簡單的範例,計算出兩個日期相差了多久。

$day=Carbon::createFromFormat("Y-m-d H:i:s","2016-12-15 4:21:56");//以指定日期時間建立一個carbon實體
$now=Carbon::now();//以現在時間建立carbon實體
//設定時區
$now->setTimezone("Asia/Taipei");
$day->setTimezone("Asia/Taipei");
//取得該日期與現在時間的差距
$diff=$day->diffForHumans();
//輸出
echo "NOWTIME:" . $now . "<BR>";
echo "距離2016-12-15 4:21:56已經過了" .$diff ;

這個範例可以應用於文章、貼文之類的發表時間,顯示多久前發表,而不是顯示日期。

載入自己的類別

composer除了載入套件,也可以載入自己編寫的類別。

以psr-4載入

修改composer.json檔案

    "autoload":{
        "psr-4": {
            "App\\":"app/"
        }
    }

因為將命名空間app設為指向app資料夾,所以必須新增一個名為app的資料夾

composer dump

再執行composer dump指令,告訴composer要幫忙自動載入

要注意的是,新增class檔案的時候,名稱記得要與class相同,否則會無法載入,並且要將class放在namespace App當中

app資料夾中的TestClass.php

namespace App;
class TestClass{
    public function __construct()
    {
        echo "TestAutoload OK!!!!";
    }
}

index.php

require (__DIR__."/vendor/autoload.php");
$testc=new \App\TestClass();

以classmap載入

如果你的class名稱與檔案名稱不同,但不想修改檔案名稱時就不能使用psr4的策略來自動載入,可以選擇classmap,composer會載入指定資料夾內的所有class。

composer.json檔案

要求composer載入資料夾lib中的class。

        "classmap": [
            "lib"
        ]

一旦修改了composer.json中的autoload就要記得執行composer dump指令

lib中的TestC.php

class test{
    public function __construct()
    {
        echo "Class Map OK!!!!";
    }
}

index.php

require (__DIR__."/vendor/autoload.php");
$classmap=new test();

以files載入

files策略就是載入指定的php檔案

Composer.json檔案

指定composer幫忙載入ClassTestFile.php。

 

        "files": [
            "ClassTestFile.php"
        ]

一樣記得執行composer dump指令

ClassTestFile.php

class good{
    public function __construct()
    {
        echo "GOOD!!!!!";
    }
}

index.php

require (__DIR__."/vendor/autoload.php");
$files=new good();

由上述三種自動載入策略,都只需要一行require就可以自動載入專案所有的類別,不必因為遺漏了include而導致程式錯誤。

結論

composer使用其實相當簡單,不僅可以管理安裝的套件,還可以將自己的類別納入管理。

 

完整的範例程式

https://github.com/nnwa1689/PHP_Composer/

本文作者:長也

糾結與想不開的資管系學生,之前常碰PHP,現在常碰到的是Python,閒暇之餘就記錄一些筆記。

             

如要發表回覆,請先 登入

  0則回覆