composer自動載入配置

淅淅瀝瀝發表於2019-02-16

composer就不多說了,是php的包管理器,和node.js的npm,python的pip差不多
composer裡面有自動載入的配置,可以幫助我們自動載入我們的類
我們通過slim來做路由演示

首先安裝slim

建立個資料夾,我命名為了modernroute(這個隨便)
然後建立composer.json檔案
安裝slim,命令列進入資料夾後

composer require slim/slim "^3.0"

這樣的話slim下好了
,在根目建立index.php檔案

<?php

require `vendor/autoload.php`;

$app = new SlimApp();

$app->get(`/`,function(){
    echo `is mine`;
});

$app->run();

然後命令列

php -S localhost:8000

讓服務跑起來;
如果我們在slim中建立了路由,希望由controller中的方法執行,而不是像這樣通過匿名函式該怎麼樣呢?
slim官方文件給了我們方法
(https://www.slimframework.com/docs/v3/objects/router.html#how-to-create-routes下搜尋關鍵字HomeController::class)

建立相應檔案

我們希望通過根目錄Controller資料夾下的UserCon類中的getUserName方法來處理 `/name`這個路由
修改index.php


require `vendor/autoload.php`;

$app = new SlimApp();

$app->get(`/`,function(){
   echo `is mine`;
});

$app->get(`/name`, ControllerUserCon::class.`:getUserName`);

$app->run();

然後再根目錄建立Controller資料夾,資料夾下建立UserCon檔案
資料夾結構如下

-  Controller
  -  UserCon.php
-  vendor    
-  index.php
-  composer.json
-  compooser.lock

在UserCon.php裡編輯內容

<?php
namespace Controller;

Class UserCon
{
   public function getUserName()
   {
       echo `wang`;
   }
}

啟動服務瀏覽器輸入 localhost:8000/name,發現報錯
<div align=”center”>
<img src=”http://ox6ze07ei.bkt.clouddn….; width = “225” height = “425” alt=”” align=center />
</div>

開啟錯誤除錯後發現slim找不到ControllerUserCon這個類
(https://www.slimframework.com/docs/v3/handlers/error.html下搜尋displayErrorDetails)

composer自動載入

這時候我們就可以使用composer中的自動載入來載入我們想要的類了。
在我們在composer.json檔案中
加入

{
    "require": {
        "slim/slim": "^3.0"
    },
    "autoload": {
        "psr-4" : {
            "" : ""
        }
    }
}

這裡的意思是根據PSR4規範來載入對應的類(PSR0,PSR4都可以,這裡用PSR4)
冒號前面是根名稱空間,冒號後面是根目錄(注意“轉義)
因為我們這裡是在ControllerUserCon下載入根目錄下Controller檔案下的UserCon類,冒號前面是根名稱空間(這裡根名稱空間就是“),
冒號後面是根目錄,所以寫成了

"psr-4" : {
            "" : ""
        }

的形式
新增完這段程式碼後需要用composer重寫自動載入(vendor/autoload)
在名命令列中

composer dump-autoload  

或者

composer install  

再次開啟服務,輸入localhost:8000/name
會發現服務已經以來了
如果我們把跟名稱空間定義為其他的,比如說Van
我們希望Van這個名稱空間指向Controller
那麼需要在composer中

修改index中`/name`的路由

$app->get(`/name`, VanUserCon::class.`:getUserName`);

修改Controller目錄下的UserCon.php

 <?php
namespace Van;

Class UserCon
{
    public function getUserName()
    {
        echo `wang`;
    }
}

這樣的話,就是Van這個名稱空間指向Controller這個資料夾了
我們需要將composer.json檔案修改為

{
    "require": {
        "slim/slim": "^3.0"
    },
    "autoload": {
        "psr-4": {
            "Van\": "Controller/"
        }
    }
}

然後重新composer install一下,就可以了,啟動服務/name下依然會正常顯示。

“files”配置

在composer.json下autoload裡,files配置的決定了單獨會自動載入進來的檔案,不要遵守PSR0和PSR4,一般用來引入公共檔案
我們在composer.json中加入 "files": ["Common/functions.php"]

{
    "require": {
        "slim/slim": "^3.0"
    },
    "autoload": {
        "psr-4": {
            "Van\": "Controller/"
        },
        "files": ["Common/functions.php"]
    }
}

然後重新install
在根目錄中建立Common資料夾,建立functions.php檔案
寫入

<?php

function getMeFive (){
   echo `haha~`;
}

然後路由中加入

$app->get(`/givemefive`,function(){
   getMeFive();
});

啟動服務訪問 localhost:8000/givemefive
頁面顯示haha~

說明正常,composer幫我們載入了這個檔案

Class-map

Class-map也是一種寫法,但是沒增加一個類都要執行一邊composer,以便生成新的autoload_classmap.php檔案
比如

"classmap": ["Model/"]

在composer中這樣寫,
他就會把Model/下的所有類檔案根據明名空間加類名一一對應起來
比如你Model中有個User類
他會生成
`Model\User` => $baseDir . `/Model/User.php`,
這樣的對應,缺點就是每當有新的類檔案我們都需要執行一下composer install生成新的classmap

相關文章