composer就很少說了,是php的包管理器,和node.js的npm,python的pip差很少
composer裏面有自動加載的配置,能夠幫助咱們自動加載咱們的類
咱們經過slim來作路由演示php
建立個文件夾,我命名爲了modernroute(這個隨便)
而後建立composer.json文件
安裝slim,命令行進入文件夾後html
composer require slim/slim "^3.0"
這樣的話slim下好了
,在根目建立index.php文件node
<?php require 'vendor/autoload.php'; $app = new Slim\App(); $app->get('/',function(){ echo 'is mine'; }); $app->run();
而後命令行python
php -S localhost:8000
讓服務跑起來;
若是咱們在slim中建立了路由,但願由controller中的方法執行,而不是像這樣經過匿名函數該怎麼樣呢?
slim官方文檔給了咱們方法
(https://www.slimframework.com/docs/v3/objects/router.html#how-to-create-routes
下搜索關鍵字\HomeController::class
)shell
咱們但願經過根目錄Controller文件夾下的UserCon類中的getUserName方法來處理 '/name'這個路由
修改index.phpnpm
require 'vendor/autoload.php'; $app = new Slim\App(); $app->get('/',function(){ echo 'is mine'; }); $app->get('/name', \Controller\UserCon::class.':getUserName'); $app->run();
而後再根目錄建立Controller文件夾,文件夾下建立UserCon文件
文件夾結構以下json
- 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>app
打開錯誤調試後發現slim找不到\Controller\UserCon
這個類
(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)
冒號前面是根命名空間,冒號後面是根目錄(注意''轉義)
由於咱們這裏是在\Controller\UserCon
下加載根目錄下Controller文件下的UserCon類,冒號前面是根命名空間(這裏根命名空間就是''),
冒號後面是根目錄,因此寫成了
"psr-4" : { "" : "" }
的形式
添加完這段代碼後須要用composer重寫自動加載(vendor/autoload)
在名命令行中
composer dump-autoload
或者
composer install
再次打開服務,輸入localhost:8000/name
會發現服務已經以來了
若是咱們把跟命名空間定義爲其餘的,好比說Van
咱們但願Van這個命名空間指向Controller
那麼須要在composer中
修改index中'/name'的路由
$app->get('/name', \Van\UserCon::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下依然會正常顯示。
在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也是一種寫法,可是沒增長一個類都要執行一邊composer,以便生成新的autoload_classmap.php文件
好比
"classmap": ["Model/"]
在composer中這樣寫,
他就會把Model/下的全部類文件根據明名空間加類名一一對應起來
好比你Model中有個User類
他會生成'Model\\User' => $baseDir . '/Model/User.php',
這樣的對應,缺點就是每當有新的類文件咱們都須要執行一下composer install生成新的classmap