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