俗话说万事开头难,如果你之前没有发布过 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 的登录身份验证,一个社交平台。
建立档案
现在建立一个新的文档:
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 去哪里拉取。
但是,这比较有利于最终软件的发布。
更多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语言学习权限!!!