如何在項目中自動加載自有的 PHP 擴展包?

俗話說萬事開頭難,如果你之前沒有發佈過 php 擴展, 並且不知道怎麼開始編寫一個 php 擴展,你可能會有很多疑問,比如:php 擴展實際安裝在了哪裏?現在已知擴展安裝在了 vendor/ 目錄下,但是該目錄已經被 ignored 記錄,並被 git 忽略,爲什麼這樣做…

現在你有三個選項可以參考

我的官方羣點擊此處

下面是三種 php 擴展開發方式:

1.在 GitHub 創建一個新的倉庫(repo), 並將其關聯 Packagist

相對複雜,這會在 Packagist 創建一個不完整的擴展包

2.創建一個新的文件夾,並將擴展更新指向該目錄。

相對簡單,但是需要你在部署服務器時執行特定配置

3.將擴展集成在項目代碼中,直到可以發佈

最簡單,這正是我們今天要討論的

事例場景

我的朋友告訴我他發佈了 Laravel Socialite 擴展,用於向 Laravel 應用添加社交身份驗證。

因此,今天我們將以此爲例,一步步創建一個可以發佈的 php 擴展。

 

確定命名空間

首先,我們要確定我們的命名空間,Socialite 規定了我們實現 Socialite 社交身份驗證組件的接口(interface),並沒有規定命名空間的設定,我們必須繼承並實現 Socialite 接口,因此我們想一下我們要發佈的 Socialite 自定義組件實現了什麼並選擇一個合適的命名空間。

我首先想到的是這是一個基於 Socialite 的擴展,發佈在 mattstauffer/socialite-providers,所以我的命名空間會是: Mattstauffer/SocialiteProviders.

我將會創建 MaceBookProvider 類,用於 MaceBook.com 的登錄身份驗證,一個社交平臺。

建立檔案

現在建立一個新的文檔:

<?php

namespace Mattstauffer\SocialiteProviders;

use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;

class MaceBookProvider extends AbstractProvider implements ProviderInterface
{
    // ...
}

但是我們要把它放在那?

在你的文件夾中建立一個 src/ 並把你的代碼放在裏面,這是選擇一。

如果你並不想放在 src/ 目錄下, 因爲你已經計劃好怎麼處理他,你也可以創建一個像 packages/ 這樣的文件夾。 下文中,我們將假設您以 packages/ 爲代碼目錄來處理。

現在我們把 packages/ 文件夾作爲我們擴展的頂級文件夾, Mattstauffer 作爲主要命名空間。 因此,我們需要添加一個 SocialiteProviders 文件夾,並創建 packages/SocialiteProviders/MaceBookProvider.php 文件。

添加 Autoload

現在我們要做的的是告訴 Composer 當我們的應用需求 Mattstauffer/ 命名空間下的類時,可以在 packages/ 找到相應的類。那麼該如何實現這個呢?

幸運的是 PSR-4 正式爲此而生的!所以我們只要告訴 Composer 我們的 packages/ 遵循 PSR-4 規則即可,Composer 會幫我們加載該目錄下的所有類。

筆記:你可以將,命名空間 packages/SocialiteProviders 修改爲 Mattstauffer/SocialiteProviders 以幫助 Composer 能夠更精準的發現您的類。

現在,編輯您的 composer.json 修改 autoload 字段,如果你用的是比較先進的框架(像 Laravel),您可能已經發現了該文件。

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },

現在添加我們的擴展指向:

"autoload": {
  "psr-4": {
            "App\\": "app/",
            "Mattstauffer\\": "packages/"
        },

執行 composer dump-autoload 以重載 autoload。

至此,一個你的自定義擴展發佈完成,你可以到此爲止,當然如果你想要了解更多,請繼續。

當我們的擴展需要其他擴展的支持我們要怎麼辦?(依賴管理)

如果您的目的是發佈該擴展,那麼現在還差很多,例如,您可能在開發該擴展時使用了其他擴展(避免重複造輪子是很有必要的),所以,你要管理的不僅僅是框架的 composer.json,你還需要自己的 composer.json。如果是上述情況,您需要建立一個獨立於 Git 倉庫之外的文件件。 (免費視頻地址 here)

拿 BestPackage 作爲例子,假如您的項目文件夾爲:BestProject,他的目錄結構將會像下面這樣:

\Users
 \mattstauffer
        \Sites
            \BestPackage
            \BestProject

那麼現在該如何使用 Git 倉庫之外的文件夾目錄呢?

這需要你修改框架 composer.json 只要將 (../BestPackage) 以 path 的方式配置即可,具體配置會在下面給出。

準備發佈您的擴展

首先,確保您的擴展包含有效的 composer.json 文件。你可以通過在擴展目錄下運行 composer init 以初始化該文件。

通過提示文件,選擇相應的選項,初始化您的 composer.json 。

現在我們的 “BestPackage” 擴展的 composer.json 初始化完成,它可能像下面這樣:

{
    "name": "mattstauffer/best-package",
    "description": "The best package!",
    "type": "library",
    "require-dev": {
        "tightenco/tlint": "^4.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Matt Stauffer",
            "email": "[email protected]"
        }
    ],
    "require": {}
}

通過 Path 類型加載擴展

接下來,回到框架目錄,編輯框架下的 composer.json,創建一個 repositories 字段,告訴 composer 以 path 的方式加載您的擴展:

{
    // require, require-dev, etc.
    "repositories": [
        {
            "type": "path",
            "url": "../BestPackage"
        }
    ]
}

應用中擴展的使用

最終,你可以像下面這樣加載您的擴展了

composer require mattstauffer/best-package

 

提醒

這種方法的缺陷是:不能隨您的代碼倉庫一起部署,還需要額外的配置以告訴 Compose 去哪裏拉取。

但是,這比較有利於最終軟件的發佈。

原文地址:https://mattstauffer.com/blog/how-to-bui...
譯文地址:https://learnku.com/laravel/t/44849
更多PHP內容請訪問:

八重櫻:騰訊T3-T4標準精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)​zhuanlan.zhihu.com圖標

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提升,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨需要的可以免費分享給大家,需要的可以加入我的官方羣點擊此處

對PHP後端技術,對PHP架構技術感興趣的朋友,我的官方羣點擊此處。鏈接加入羣聊【PHP/web/高級學習交流羣】,一起學習,相互討論。

羣內已經有管理將知識體系整理好(源碼,學習視頻等資料),歡迎加羣免費領取。

這套精品PHP教程絕不是市場上的那些妖豔賤貨可比,作爲web開發的佼佼者PHP並不遜色其他語言,加上Swoole後更加是如虎添翼!進軍通信 、物聯網行業開發百度地圖、百度訂單中心、虎牙、戰旗TV等!寒冬裁員期過後正是各大企業擴大招人的時期,現在市場初級程序員氾濫,進階中高級程序員絕對是各大企業急需的人才,這套學習教程適合那些1-5年以內的PHP開發者正處於瓶頸期,想要突破自己進階中高級、架構師!名額有限,先到先得!

部分資料截圖:


還有限時精品福利:

★騰訊高級PHP工程師筆試題目

★億級PV高併發場景訂單的處理

★laravel開發天貓商城組件服務

★戰旗TV視頻直播的架構項目實戰

掃描下面二維碼領取

對PHP後端技術,對PHP架構技術感興趣的朋友,我的官方羣點擊此處,一起學習,相互討論。

羣內已經有管理將知識體系整理好(源碼,學習視頻等資料),歡迎加羣免費領取。

本課程深度對標騰訊T3-T4標準,貼身打造學習計劃爲web開發人員進階中高級、架構師提升技術,爲自己增值漲薪!加入BAT特訓營還可以獲得內推大廠名額以及GO語言學習權限!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章