現在的位置: 首頁 > 雲計算 > 正文

Composer如何實現項目的自動載入

2020年01月06日 雲計算 ⁄ 共 2617字 ⁄ 字型大小 評論關閉

  Composer管理依賴包,實現自動載入

  composer通過require、remove命令對項目進行依賴包的添加與刪除。

  composer通過對項目根目錄下的composer.json文件的配置,可以實現PSR-4自動載入的規範。

  composer.json架構詳解,此處有詳細介紹如何配置該文件。

  通過對TP5.1的源碼進行學習,TP5的自動載入主要是根據composer install命令執行後composer在vendor目錄下生產的ClassLoader類進行重寫。Composer自動載入機制,是建立命名空間與文件相對於項目根目錄路徑的映射關係,再通過spl_autoload_register方法註冊系統的自動載入,在自動載入 邏輯當中,最核心的是怎麼樣根據上面生成的路徑,查找到相應的文件,並include(包含)進來。

  composer自動載入詳細流程:

  ● 配置根目錄下的composer.json文件中的autoload的自動載入映射規則。

  ● 調用composer install/update 命令,生成vendor/composer文件夾以及相關的文件。其中命名空間與文件路徑的映射保存在autoload_psr4.php文件中。同時生成ClassLoader.php文件,該文件是自動載入的工具類,通過解析命名空間,查找到相關文件,以便include進來。

  ● 在入口文件處include vendor文件夾下面的autoload.php文件。若要想更改自動載入相關的官方,自定義一些操作,可以根據composer生成的ClassLoader文件自行編寫一個載入器工具類,前提是理解composer的自動載入原理,以及PSR4自動載入規範。具體的可以參考tp5裡面的Loader類的實現。

  準備工作:提前安裝好composer

  1.創建項目目錄OOP

  2.OOP目錄下新建composer.json文件,composer.json是一個空json文件

  3.打開控制台,進入項目目錄OOP,在OOP目錄下運行composer命令:

  composer install

  4.運行後自動生成composer文件目錄,目錄結構如下:

  OOP

  - Vendor

  - composer

  - autoload_classmap.php

  - autoload_namespaces.php

  - autoload_psr4.php

  - autoload_real.php

  - autoload_static.php

  ClassLoader.php

  installed.json

  LICENSE

  - autoload.php

  - composer.json

  5.自動生成目錄結構後,在composer.json文件中新增代碼,實現自動載入,代碼如下:

  {

  "autoload": {

  "psr-4": {

  "Andy\\" : "src"

  }

  }

  }

  Andy是廠商名,src是對應的目錄名。

  6.新建src目錄,在src目錄下,創建一個類文件AuthController.php,該文件代碼如下:

  ​

  namespaceAndy; // 設置命名空間

  ​

  classAuthController{

  publicfunctiontest(){

  echo'test';

  }

  }

  7.使用類文件。在OOP目錄下新建index.php文件,此時的目錄結構如下:

  OOP

  - Src

  - AuthController.php

  - Vendor

  - composer

  - autoload_classmap.php

  - autoload_namespaces.php

  - autoload_psr4.php

  - autoload_real.php

  - autoload_static.php

  ClassLoader.php

  installed.json

  LICENSE

  - autoload.php

  - composer.json

  - index.php

  在index.php文件中引入AuthController類,index.php文件代碼如下:

  require'vendor/autoload.php';

  $auth=newAndy\AuthController();

  echo$auth->test();

  運行index.php文件,提示錯誤信息:

  Class'Andy\AuthController'notfound

  這是因為修改後的composer文件還未生效,我們需要在控制器運行如下composer命令:

  composer dump-autoload

  打開Vendor/autoload_psr4.php,自動生成如下代碼:

  // autoload_psr4.php @generated by Composer

  $vendorDir=dirname(dirname(__FILE__));

  $baseDir=dirname($vendorDir);

  returnarray(

  'Andy\\'=>array($baseDir . '/src'),

  );

  即是將Andy替換成OOP/src。再次運行index.php文件,運行結果如下:

  test

  說明自動載入生效了,因為在沒有使用require引入類文件的情況下,直接在index.php文件中使用關鍵字new 實例化對象成功了。

  使用use 關鍵字引入。在index.php文件中,我們使用 new Andy\AuthController()引入類文件,很多時候,廠商的名字不像「Andy」只有4個字母,通常會很長,並且會在多處使用。針對這種情況,可以在使用類之前,添加use關鍵字來實現。修改index.php文件,修改後代碼如下:

  useAndy\AuthController; // 使用use關鍵字

  require'vendor/autoload.php';

  $person=newAuthController(); // 更改引用方式

  echo$person->test();

  運行結果相同。

  注意:多數情況下,忘記使用composer dump-load命令導致找不到類名。

抱歉!評論已關閉.