composer自動加載配置

composer就很少說了,是php的包管理器,和node.js的npm,python的pip差很少
composer裏面有自動加載的配置,能夠幫助咱們自動加載咱們的類
咱們經過slim來作路由演示php

首先安裝slim

建立個文件夾,我命名爲了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中的自動加載來加載咱們想要的類了。
在咱們在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下依然會正常顯示。

"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

相關文章
相關標籤/搜索