composer引入本地自己开发的php扩展包

news/2024/11/28 7:42:03/文章来源:https://www.cnblogs.com/panhowe/p/18570808

开发自己的php扩展包

一、创建扩展包目录结构

1. 创建目录hoo-tool,在目录下创建目录 src
2. 在hoo-tool 目录下 运行命令:composer init

3. 运行完命令的效果

{"name": "hoo/tool","description": "hoo Tool kit for PHP","type": "library","license": "MIT","autoload": {"psr-4": {"Hoo\\Tool\\": "src/"}},"authors": [{"name": "hoo","email": "hoo@example.com"}],"minimum-stability": "alpha","require": {}
}

二、编写composer.json文件

本文PHP版本是使用8.2
所以在composer.json 中编写,指定require的PHP版本:

"require": {"php": ">=8.0"}

三、编写扩展包的PHP代码

1. 编写一个响应工具,Hoo\Tool这个命名空间对应src目录

在src目录下创建 ResultTool.class类

<?phpnamespace Hoo\Tool;use Hoo\Tool\Constants\ErrorCode;class ResultTool
{/*** @param array $data* @return array*/public static function success(array $data = []): array{return static::end(ErrorCode::SUCCESS, ErrorCode::getMessage(ErrorCode::SUCCESS), $data);}/*** @param int $code* @param string $message* @param array $data* @return array*/public static function error(string $message = '', int $code = ErrorCode::ERROR, array $data = []): array{if (empty($message)) {return static::end($code, ErrorCode::getMessage($code), $data);} else {return static::end($code, $message, $data);}}/*** @param $code* @param $message* @param $data* @return array*/protected static function end($code, $message, $data): array{return ['code' => $code,'message' => $message,'data' => $data,];}
}
2. 编写一个响应工具的状态码类

src目录下创建Constants目录
创建ErrorCode.class

<?phpnamespace Hoo\Tool\Constants;class ErrorCode
{public const SUCCESS = 200;public const ERROR = 0;public static function getMessage(int $code): string{$errors = [0 => 'Server Error!',200 => 'success',// Add more as needed];return $errors[$code] ?? 'Unknown error';}
}
3. 再编写一个日志工具

在src目录创建 LoggerUtil.class类

<?phpnamespace Hoo\Tool;class LoggerUtil
{private string $filePath;private string $dirName = './runtime/logs/'; // 日志文件目录private float|int $maxFileSize = 2 * 1024 * 1024; // 2MB 文件大小限制private string $datePattern = 'Y-m-d'; // 日志文件命名中的日期格式private bool $rollingType = true; // true按文件大小滚动,false按日期滚动/*** 检查并执行日志文件的滚动*/private function checkAndRollFile(){$dir_path = dirname($this->filePath);if (!file_exists($dir_path)) {mkdir($dir_path, 0755, true); // 0755 表示权限,true 表示递归创建}// 检查是否需要按日期滚动if (!$this->rollingType && file_exists($this->filePath) && date($this->datePattern) !== date($this->datePattern, filemtime($this->filePath))) {$this->rollByDate();}// 检查文件大小clearstatcache(true, $this->filePath);if ($this->rollingType && file_exists($this->filePath) && filesize($this->filePath) >= $this->maxFileSize) {$this->rollBySize();}}/*** 按日期滚动日志文件*/private function rollByDate(){$newPath = $this->getNewFilePath(true);rename($this->filePath, $newPath);}/*** 按大小滚动日志文件*/private function rollBySize(){$newPath = $this->getNewFilePath(false, true);rename($this->filePath, $newPath);}/*** 获取新日志文件的路径** @param bool $byDate 是否按日期滚动* @param bool $forcedBySize 是否因文件大小强制滚动* @return string 新的日志文件路径*/private function getNewFilePath($byDate = false, $forcedBySize = false){$baseName = pathinfo($this->filePath, PATHINFO_FILENAME);$extension = pathinfo($this->filePath, PATHINFO_EXTENSION);$dirName = pathinfo($this->filePath, PATHINFO_DIRNAME);$suffix = '';if ($byDate) {$suffix = '_' . date($this->datePattern);} elseif ($forcedBySize) {$suffix = '_size_' . date('Hi');}return "{$dirName}/{$baseName}{$suffix}.{$extension}";}/*** 写入日志内容** @param string $fileName* @param mixed $content* @param string $label* @return bool*/public static function write(string $fileName, mixed $content, string $label = ''): bool{$instance = new self();$instance->filePath = $instance->dirName . date('Ymd') . '/' . $fileName . '.log';$instance->checkAndRollFile();if (is_string($content)) {$content = "[" . date("Y-m-d H:i:s") . "] " . $label . ' ' . $content . PHP_EOL;} else {$content = "[" . date("Y-m-d H:i:s") . "] " . $label . PHP_EOL . var_export($content, true) . PHP_EOL;}// 写入日志$result = file_put_contents($instance->filePath, $content, FILE_APPEND);return $result !== false;}}

引入自己开发的包

1. 编辑composer.json文件

在项目中引入未提交的包

"repositories": [{"type": "path","url": "包的觉得路径"}]

url的配置示例:

  • windows "D:\docker-code\code\hoo-tool"
  • linux:"/code/hoo-tool"
2. 引入包

composer require hoo/tool

3. 使用包
<?phpdeclare(strict_types=1);namespace App\Controller;use HooTool\LoggerUtil;
use HooTool\ResultTool;class IndexController extends AbstractController
{public function index(){LoggerUtil::write('test',' Check If The Application Is Under Maintenance','test');return ResultTool::success('获取成功',['method' => 'post','message' => "Hello hoo-tool",]);return ResultTool::error('服务器错误',500,['method' => 'post','message' => "Hello hoo-tool",]);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/841780.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博客园 geek 主题备份

预览页面定制 CSS 代码禁用模板默认CSS#loading{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999;background-color:#f4f5f5;pointer-events:none;}.loader-inner{will-change:transform;width:40px;height:40px;position:absolute;top:50%;left:50%;margin:-20px …

【cesium重新梳理】1.cesium知识整理

之前零零碎碎学过、用过cesium,但也没做记录,现在重新整理一下,方便学习回顾。 1.cesium简介 CesiumJS是一个开源JavaScript库,用于创建具有最佳性能、精度、视觉质量和易用性的世界级3D地球仪和地图。从航空航天到智能城市再到无人机,各行各业的开发人员都使用CesiumJS创…

WebRTC 作者加入 OpenAI 主导实时 AI 项目;TTS 小模型 OuteTTS v0.2 发布:声音克隆+多语言

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

关于mac安装ENSP的一点个人看法

如何在mac上安装ensp呢 目前主流的教程都是教大家在PD上面安装ENSP,但是这样就不可避免的会有两个问题,第一内存够用?第二CPU是什么型号的? 大多数教程中都忽略了这两个问题,就算有,也只是泛泛而言,并没有真正的安装ENSP并且测试。首先MAC电脑要安装ENSP,必须要满足一个…

[Avalonia] 练习一:搭建Avalonia+Prism+Material项目

这是个练手项目,初次接触Avalonia,决定搭建一个架构由Prism实现,UI基于Material的演示基本控件、自定义控件、遮罩、弹窗、标签页等UI基础的桌面项目,实现这些UI基础,基于WPF转Avalonia应该就没太大的问题了。 一、新建项目。新建空白解决方案AvaloniaApps。 新建项目,选…

【cesium】修改底图颜色为蓝色科技范儿

cesium中,默认的底图颜色往往难以满足个性化需求,而【蓝色科技】风格常常备受青睐,本文从实操角度介绍实现方法。 简单来说,我们所用的方法叫做【反色滤镜】,总的分为2个步骤,反色,过滤。具体做法如下: 首先要获取目标影像图层,这里不能直接对div进行操作,因为会将地…

51单片机入门:独立按键(02)

标题: ​ 51单片机入门:独立按键(02) 一、独立按键的基本结构和功能二、独立按键在单片机的位置三、初次使用独立按键 设计第1个程序,使用按键K1控制D1的亮灭 #include<regx52.h>void main() {while(1){if(P3_1 == 0) // 按下按钮相当于接地 P3_1 == 0; {P2_0 = 0…

【cesium】打造科技感建筑泛光效果

一些智慧城市项目经常需要加载建筑白膜数据(3dtiles),并制作炫酷的炫光效果,在cesium中可以使用自定义着色器修改白膜建筑的外观。 1.首先,加载3Dtiles格式的建筑白膜数据,这里我们使用一个免费的数据链接: data.mars3d.cn/3dtiles/jzw… 这是mars3D提供的一个链接,发送…

k8s容器中的Java进程经常自动被杀

故事背景 主角:低代码项目agile-bpm 时间:2023-08-29 背景:项目通过jenkins部署k8s容器到虚拟机,在一次部署之后,服务发生无限重启的现象,springboot项目起来后没多久(甚至有几次还没启动)就会被杀掉进程,服务宕机了一个晚上。 排查过程 查看日志 通过 kubelet logs 命…

从零开始:苹果手机免越狱群控系统的快速入门指南

对于初次接触苹果手机免越狱群控系统的用户来说,可能会感到有些困惑和不知所措。本章将提供一个详细的快速入门指南,帮助你从零开始,轻松掌握如何设置和使用这项强大的技术。免越狱群控系统概述 苹果手机免越狱群控系统是一种通过合法合规的技术手段,在不破坏iOS系统安全性…

网站模板文字内容修改,如何在网站后台或代码编辑器中修改模板文字内容

修改模板文字内容可以提升网站的信息传达效果。以下是具体步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单栏中的“模板”或“主题”。 选择“模板管理”或…

网站模板文字内容修改,如何在网站后台或代码编辑器中准确修改模板文字内容

修改模板文字内容可以提升网站的信息传达效果。以下是如何准确在网站后台或代码编辑器中修改模板文字内容的步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单…