编写composer包和发布全攻略

server/2024/12/19 18:51:35/

laravel composer 扩展包开发(超详细)

composer_2">快速发布一个composer扩展包

我之所以想先带大家快速了解一个composer包的发布过程,是因为我打算把二次封装的组件作为composer包发布。我必须了解composer组件怎么发布,有哪些功能。

创建packages

在哪个目录创建packages,我们可以先来看一下vendor。
在这里插入图片描述
在上图中,vendor是和app是同一级别的,vendor下存放的是不同的组件。所以我们参照vendor,建立一个packages。我们再来看看包名怎么命名。

  1. 命名空间(Vendor Name)
    通常使用你的公司名、组织名或个人用户名作为命名空间。这有助于区分不同来源的包,并且可以防止命名冲突。命名空间应全部使用小写字母,以保持一致性。
  2. 包名(Package Name)
    包名应该能够清晰地描述包的功能或用途。使用连字符 - 分隔多个单词,而不是下划线 _ 或驼峰命名法。
  3. 完整的包标识符
    vendor-name/package-name
    比如
php">laravel/framework
spatie/laravel-permission
tightenco/ziggy

那我们给我们的包起个名字,linxi/exception-helper,exception-helper其实就是为了更友好的获取异常信息

下面我们进入到这个目录,并初始化一个composer文件

php">$ site/packages/linxi/exception-helper
$ composer init

一路敲enter就行了,不用太纠结。因为这个后面是可以改的。
在这里插入图片描述
整个包目录就是长这个样子了。

provider

项目根目录下执行php artisan make:provider ExceptionHelperProvider,生成一个provider文件,并把文件剪切到packages/linxi/exception-helper/src/目录下。
那么这个provider有什么作用呢,我们具体来看一下

作用
  • 注册服务:
    服务提供者是注册应用程序服务的主要位置。使用$this->app->bind()方法可以将服务绑定到服务容器中,使得该服务可以在整个应用中被解析。
  • 引导服务:
    除了注册服务外,服务提供者还可以用来引导服务。这可能包括加载配置文件、初始化类实例或设置全局状态。例如,很多服务提供者会在这里注册路由、事件监听器或视图组件。
  • 发布配置和资源:
    使用publishes方法,服务提供者可以为包或自定义模块发布配置文件、视图、迁移文件等资源,以便开发者可以根据需要进行调整。
  • 注册命令:
    服务提供者可以通过$commands属性来注册Artisan命令。这些命令可以在命令行界面中使用,用于执行各种任务,如数据库迁移、队列处理等。
  • 绑定接口到实现:
    在服务提供者中,你通常会定义接口与其实现之间的绑定,这样当接口被解析时,就可以得到正确的实现对象。
  • 设置别名:
    服务提供者可以设置类的别名(Facade),简化代码书写,使开发更加方便。比如Cache::get(‘key’)这样的写法背后其实是对Illuminate\Cache\CacheManager的一个优雅封装。
  • 扩展核心组件:
    服务提供者允许你扩展Laravel的核心组件,例如添加自定义的验证规则、日志记录通道等。
  • 注册事件监听器、中间件、路由等:
    服务提供者可以用来注册事件监听器、中间件以及路由,从而控制请求的生命周期和响应逻辑。
  • 延迟加载服务:
    如果某个服务不是每次请求都需要,那么可以将其标记为延迟加载(Deferred Provider)。这样,只有当服务真正被请求时才会加载它,有助于提高应用性能。

接下来我们来编辑一下provider类

php"><?phpnamespace Linxi\ExceptionHelper;use Illuminate\Support\ServiceProvider;class ExceptionHelperProvider extends ServiceProvider
{/*** Register services.** @return void*/public function register(){// 绑定异常处理服务到服务容器$this->app->singleton('exception.helper', function ($app) {return new ExceptionHelper();});}public function boot(){// 如果需要引导任何服务,可以在这里进行。// 例如:注册视图组件、事件监听器等。// 视图目录指定$this->loadViewsFrom(__DIR__ . '/views', 'Packagetest');$this->publishes([// 发布视图目录到resources 下
//            __DIR__ . '/views' => base_path('resources/views/vendor/packagetest'),// 发布配置文件到 laravel 的config 下__DIR__ . '/config/exception-helper.php' => config_path('exception-helper.php'),]);// 发布视图(如果有)
//        $this->loadViewsFrom(__DIR__.'/../resources/views', 'exception-helper');// 注册事件监听器
//        \Event::listen(\Illuminate\Auth\Events\Registered::class, \Linxi\ExceptionHelper\Listeners\LogSuccessfulRegistration::class);// 注册中间件(如果需要)$router = $this->app['router'];
//        $router->aliasMiddleware('custom.middleware', \Linxi\ExceptionHelper\Http\Middleware\CustomMiddleware::class);// 注册路由(如果需要)
//        $this->loadRoutesFrom(__DIR__.'/../routes/web.php');}
}

里面我只用了发布配置文件的功能,对应的包里面的配置文件是src/config目录的exception-helper.php文件,我们先来创建一下文件。
site/packages/linxi/exception-helper/src/config/exception-helper.php

php"><?php
return ['is_dump'=>1,//是否打印异常信息
];

逻辑实现的类

site/packages/linxi/exception-helper/src/ExceptionHelper.php

php"><?phpnamespace Linxi\ExceptionHelper;use Illuminate\Config\Repository;
use Illuminate\Support\Facades\Log;class ExceptionHelper
{protected $config;public function __construct(Repository $config){$this->config = $config;}public function exceptionEcho($msg = '', $data = [], $level = 'INFO'){if (!empty($data) && $data instanceof \Exception) {$data = ['echoLog报错信息' => $data->getMessage(),'echoLog报错文件' => $data->getFile(),'echoLog报错行号' => $data->getLine(),'文件堆栈' => $data->getTraceAsString(),];}$result['msg'] = $msg;if (!empty($data)) {$result['data'] = $data;}//记录日志Log::$level($msg, $result);//如果是error 级别,则飞书报警if ($level == 'error') {//飞书报警// 发飞书消息}if ($this->config->get('exception-helper.is_dump')) {//获取配置参数echo PHP_EOL . json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL;}}}

创建Facade

在包目录下的src下,创建Facades目录,在目录下创建ExceptionHelper.php

php"><?phpnamespace Linxi\ExceptionHelper\Facades;use Illuminate\Support\Facades\Facade;class ExceptionHelper extends Facade
{protected static function getFacadeAccessor(){return 'exception-helper';}
}

php_191">注册到config/app.php

php">      'providers' => [  \Linxi\ExceptionHelper\ExceptionHelperProvider::class,],'aliases' => ['ExceptionHelper'=>\Linxi\ExceptionHelper\Facades\ExceptionHelper::class,]

那么我们这个包怎么让laravel项目识别呢?我们知道,composer是laravel的包管理工具,所以我们就编辑一下laravel目录下的composer.json文件,在autoload项下增加一个属性,对应的是命名空间和包目录。

php"> "autoload": {"psr-4": {"App\\": "app/","Linxi\\ExceptionHelper\\": "packages/linxi/exception-helper/src/"}}

然后执行composer dump-autoload 重新索引一下包的信息就可以了。

发布引导文件

我们创建provider的时候,指定了一些资源文件和目录,我们使用vendor:publish把文件发布出来

php">$ php artisan vendor:publish --provider="Linxi\ExceptionHelper\ExceptionHelperProvider"Copied File [/packages/linxi/exception-helper/src/config/exception-helper.php] To [/config/exception-helper.php]
Publishing complete.

看执行结果,我们的配置文件发布到了项目根目录下的config目录下。
在这里插入图片描述

测试

接下来我们简单写一点代码测试一下功能

php">    public function handle(){try {throw new \Exception('测试异常');}catch (\Exception $e){ExceptionHelper::exceptionEcho('发短信功能异常',$e,'error');}}

查看打印结果
在这里插入图片描述

这样我们的功能就完成了。

包的发布

那么我们怎么把我们的包发布出去呢?我们来看一下
1.发布packages的包到github,我们切换到包的目录下

php">$ cd site/packages/linxi/exception-helper

把包提交到github。并那到github的地址

php">https://github.com/guofuzhang/exception-helper

2.登录https://packagist.org/关联github的项目地址并发布
在这里插入图片描述

在这里插入图片描述
发布之后,我们就可以正常通过require来拉取组件了。
接下来我们把我们的项目恢复一下

  • 移出packages目录
  • 恢复composer.json包文件
  • config/app.php文件恢复
  • config目录的配置文件删除

包的安装

php">composer require linxi/exception-helper
  • provider和facade注册到config/app.php
  • 发布配置文件
php"> php artisan vendor:publish --provider="Linxi\ExceptionHelper\ExceptionHelperProvider"
  • 测试
    在这里插入图片描述

制品库

我们也可以把我们的包放到制品库里面
在这里插入图片描述

配置

在制品库的引导里面设置自己的权限
在这里插入图片描述

制作

我们进入package目录下的pusar-client 项目

php">$ zip -r pulsar-client.zip . -x "./vendor/*"
#注意下面的版本号
$ curl -T pulsar-client.zip -u acurd-com@163.com "https://xxxx/pulsar-client?version=v1.0.1"

推送之后就可以在制品库看到推送的版本
在这里插入图片描述

拉取

在项目的根目录下创建auth.json,内容就是拉取配置凭证的内容,有这个auth文件才有权限拉取。注意,这个权限表示针对单个项目的,而是针对制品库的。
在这里插入图片描述

然后拉取composer包就行了

php">php8 /usr/local/bin/composer require dyxc/pulsar-client:v1.0.1 -vvv

参考

laravel composer 扩展包开发(超详细)


http://www.ppmy.cn/server/151513.html

相关文章

使用 Wireshark 和 Lua 脚本解析通讯报文

在复杂的网络环境中&#xff0c;Wireshark 凭借其强大的捕获和显示功能&#xff0c;成为协议分析不可或缺的工具。然而&#xff0c;面对众多未被内置支持的协议或需要扩展解析的场景&#xff0c;Lua 脚本的引入为Wireshark 提供了极大的灵活性和可扩展性。本文将详细介绍如何使…

Flink是什么?Flink技术介绍

官方参考资料&#xff1a;Apache Flink — Stateful Computations over Data Streams | Apache Flink Flink是一个分布式流处理和批处理计算框架&#xff0c;具有高性能、容错性和灵活性。以下是关于Flink技术的详细介绍&#xff1a; 一、Flink概述 ‌定义‌&#xff1a;Fli…

使用阿里云Certbot-DNS-Aliyun插件自动获取并更新免费SSL泛域名(通配符)证书

进入nginx docker&#xff0c;一般是Alpine Linux系统 1. 依次执行命令: sudo docker-compose exec nginx bashapk updateapk add certbot apk add --no-cache python3 python3-dev build-baseapk add python3 py3-pippip3 install --upgrade pippip3 install certbot-dns-ali…

文件断点续传(视频播放,大文件下载)

客户端每次请求取大文件部分数据。 浏览器播放mp4视频时&#xff0c;会首先传Range消息头&#xff0c;检测到206状态码&#xff0c;和Content-Range&#xff0c;Accept-Ranges 会自动请求余下数据。后端需要在文件任意偏移量取数据。 参考&#xff1a; springboot项目实现断…

TensorFlow和Keras的区别和关系

TensorFlow和Keras是机器学习和深度学习中的两个重要的框架。 机器学习是计算机系统从经验中自动学习的一门学科&#xff0c;它的核心是从数据中构建算法模型&#xff0c;以便系统能够预测和改进某种行为&#xff0c;从而更加智能地执行新任务。 而深度学习是基于机器学习的一种…

linux 免密远程到多个服务器如何实现

要实现从主机 192.168.1.2 免密远程连接到 192.168.1.3 和 192.168.1.4&#xff0c;您可以使用 SSH 密钥对进行身份验证。以下是详细的步骤&#xff1a; 步骤 1&#xff1a;生成 SSH 密钥对 在 192.168.1.2 主机上生成 SSH 密钥对&#xff08;如果您尚未生成过&#xff09;&a…

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块&#xff0c;旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项&#xff0c;企业可实现精细化管理&#xff0c;提升运营效…

[shader]【图形渲染】【unity】【游戏开发】 Shader数学基础2-认识点和矢量

在计算机图形学和Shader编程中,点和矢量是两种常见且基础的数学对象。它们在空间中的作用和性质是理解图形渲染的关键。本篇文章将深入探讨点(Point)和矢量(Vector)的定义、特性以及它们之间的关系。 1. 点(Point)的定义 在数学和计算机图形学中,**点(Point)**用于…