如何在项目中自动加载自有的 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": "matt@tighten.co"

        }

    ],

    "require": {}

}

通过 Path 类型加载扩展

接下来,回到框架目录,编辑框架下的 composer.json,创建一个 repositories 字段,告诉 composer 以 path 的方式加载您的扩展:

{

    // require, require-dev, etc.

    "repositories": [

        {

            "type": "path",

            "url": "../BestPackage"

        }

    ]

}

应用中扩展的使用

最终,你可以像下面这样加载您的扩展了

composer require mattstauffer/best-package

提醒

这种方法的缺陷是:不能随您的代码仓库一起部署,还需要额外的配置以告诉 Compose 去哪里拉取。

但是,这比较有利于最终软件的发布。


更多PHP内容请访问:

腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)​

以上内容希望帮助到大家,很多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语言学习权限!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341