如何开发 Laravel 扩展包并发布到 Composer

 发布于 2019-01-22 cxp1539  1074 Vie
 
开发扩展包

我们来做一个根据第一个字符或者汉字生成头像的laravel扩展包。其实原理就是我们自己去写一个服务提供者,把服务提供者配置到app/providers数组中。

1.第一步现在自己项目中跟目录创建packages/cxp/avatar/src

2.修改 composer.json

  1. "psr-4": {
  2. "App\\": "app/",
  3. "Cxp\\Avatar\\": "packages/cxp/avatar/src/"
  4. }
  1. 执行composer dumpautoload

  2. src 目录创建 Avatar.php 具体代码


  1. /**
  2. * Created by PhpStorm.
  3. * User: mac
  4. * Date: 2019-01-10
  5. * Time: 14:06
  6. */
  7. namespace Cxp\Avatar;
  8. use Illuminate\Config\Repository;
  9. class Avatar {
  10. protected $config;
  11. /**
  12. * 构造方法
  13. */
  14. public function __construct(Repository $config)
  15. {
  16. $this->config = $config->get('avatar');
  17. }
  18. /**
  19. * 生成图像
  20. * @return resource 图片资源
  21. */
  22. private function generate($name)
  23. {
  24. // 创建图片资源
  25. $img_res = imagecreate($this->config['width'], $this->config['height']);
  26. // 背景颜色
  27. $bg_color = imagecolorallocate($img_res, mt_rand(120, 190), mt_rand(120, 190), mt_rand(120, 190));
  28. // 文字颜色
  29. $font_color = imagecolorallocate($img_res, mt_rand(190, 255), mt_rand(190, 255), mt_rand(190, 255));
  30. // 填充背景色
  31. imagefill($img_res, 1, 1, $bg_color);
  32. // 计算文字的宽高
  33. $pos = imagettfbbox($this->config['size'], 0, $this->config['font_file'], mb_substr($name, 0, 1));
  34. $font_width = $pos[2] - $pos[0] + 0.32 * $this->config['size'];
  35. $font_height = $pos[1] - $pos[5] + -0.16 * $this->config['size'];
  36. // 写入文字
  37. imagettftext($img_res, $this->config['size'], 0, ($this->config['width'] - $font_width) / 2, ($this->config['height'] - $font_height) / 2 + $font_height, $font_color, $this->config['font_file'], mb_substr($name, 0, 1));
  38. return $img_res;
  39. }
  40. /**
  41. * 输出图片(默认输出到浏览器,给定输出文件位置则输出到文件)
  42. * @param string|false $path 保存路径
  43. */
  44. public function output($name, $path = false)
  45. {
  46. $img_res = $this->generate($name);
  47. // 确定输出类型和生成用的方法名
  48. $content_type = 'image/' . $this->config['type'];
  49. $generateMethodName = 'image' . $this->config['type'];
  50. // 确定是否输出到浏览器
  51. if (!$path) {
  52. header("Content-type: " . $content_type);
  53. $generateMethodName($img_res);
  54. } else {
  55. $generateMethodName($img_res, $path);
  56. }
  57. // 释放图片内存
  58. imagedestroy($img_res);
  59. }
  60. }
  1. 再src下创建config 目录来存取我们的配置参数文件如config/avatar.php

  1. /**
  2. * Created by PhpStorm.
  3. * User: mac
  4. * Date: 2019-01-10
  5. * Time: 14:28
  6. */
  7. return [
  8. 'type' => 'png', // jpeg|png|gif|bmp
  9. 'width' => '100',
  10. 'height' => '100',
  11. 'size' => '26',
  12. 'font_file' => public_path() . '/fonts/WawaSC-Regular.otf',
  13. ];
  1. 在src创建AvatarProvider.php即服务提供者。供ioc容器注册
  1. namespace Cxp\Avatar;
  2. use Illuminate\Support\ServiceProvider;
  3. class AvatarProvider extends ServiceProvider
  4. {
  5. /**
  6. * Bootstrap the application services.
  7. *
  8. * @return void
  9. */
  10. public function boot()
  11. {
  12. // 发布配置文件
  13. $this->publishes([
  14. __DIR__.'/config/avatar.php' => config_path('avatar.php'),
  15. ]);
  16. }
  17. /**
  18. * Register the application services.
  19. *
  20. * @return void
  21. */
  22. public function register()
  23. {
  24. $this->app->singleton('avatar', function ($app) {
  25. return new Avatar($app['config']);
  26. });
  27. }
  28. }
  1. 如果想使用门脸,可以在src目录下创建Facades目录,提供门脸
  1. namespace Cxp\Avatar\Facades;
  2. use Illuminate\Support\Facades\Facade;
  3. class Avatar extends Facade
  4. {
  5. protected static function getFacadeAccessor()
  6. {
  7. return 'avatar';
  8. }
  9. }

使用扩展包

到此我们开发就完成了,那改怎么使用了。

  1. 先发布配置文件在config目录下面
  1. php artisan vendor:publish
  1. 在app/config目录注册我们的服务提供者和门脸类
  1. 'providers' => [
  2. Cxp\Avatar\AvatarProvider::class,
  3. ]
  4. 'aliases' => [
  5. 'Avatar' => Cxp\Avatar\Facades\Avatar::class,
  6. ]
  1. 程序中使用
  1. Avatar::output('赵','zhao.png');

发布扩展包

1.在avatar目录执行composer init,生成composer.json

  1. {
  2. "name": "cxp/laravel-avatar",
  3. "description": "laravel avatar",
  4. "license": "MIT",
  5. "authors": [
  6. {
  7. "name": "cxp1539",
  8. "email": "457714145@qq.com"
  9. }
  10. ],
  11. "autoload": {
  12. "psr-4": {
  13. "Cxp\\Avatar\\": "src"
  14. }
  15. },
  16. "require": {}
  17. }

2.在github创建个项目,将avatar目录的代码推送到github上。

3.打开https://packagist.org/ 注册个账号,提交git的地址就可以了。

示例代码下载链接

如何开发 Laravel 扩展包并发布到 Composer的更多相关文章

  1. 如何开发、本地测试、发布 Laravel 扩展包?

    如何开发.本地测试.发布 Laravel 扩展包?  Laravel/ 1年前/  4022 /  11   现在已经有了很多,关于如何开发 Laravel 扩展包的文章.但是大多文章写的太过片面,不 ...

  2. 基于Composer的Laravel扩展包开发工作流 ,实现laravle项目的文件管理(记录成长)

    PHP Composer包开发 基于Composer的Laravel扩展包开发工作流 实现laravle项目的文件管理,添加文件/文件夹,删除文件,查看代码/文件(代码支持缩进,支持语法高亮) com ...

  3. 【转】下载量最高的 100 个 Laravel 扩展包推荐

    说明 Laravel 另一个令人喜欢的地方,是拥有活跃的开发者社区,而活跃的开发者社区带来的,是繁华的扩展包生态. 本文对 Packagist 上打了 Laravel 标签 的扩展包进行整理,截止到现 ...

  4. 使用 Composer 安装Laravel扩展包的几种方法

    使用 Composer 安装Laravel扩展包的几种方法 以下的三种方法都是需要你在项目的根目录运行 第一种:composer install 如有 composer.lock 文件,直接安装,否则 ...

  5. 如何正确使用 Composer 安装 Laravel 扩展包

    我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 composer ...

  6. laravel 安装 Laravel 扩展包

    问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 comp ...

  7. 如何开发一个npm包并发布到npm中央仓库

    转自: https://liaolongdong.com/2019/01/24/publish-public-npm.html 如何开发一个npm包并发布到npm中央仓库需求背景:平时在项目工作中可能 ...

  8. 基于Composer的Laravel扩展包开发工作流

    使用场景 在引用第三方包的时候,对第三方包有改动需求,需要将代码放在自己的仓库:并且自己的其他项目也有需求引用自定义的第三方包:甚至自己会发布修改后的第三方包: 读完本文你讲获得: Git Submo ...

  9. laravel扩展包开发步骤总结

    1. 创建包 php artisan workbench vendor/package --resources     注:  vendor:开发商名   package:包名   2.修改下包里co ...

随机推荐

  1. sscanf在字符串中的一些使用

    弟弟的作业 你的弟弟刚做完了"100以内数的加减法"这部分的作业,请你帮他检查一下.每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过 ...

  2. 压缩&&解压

    压缩与解压缩: ############################################################# tar xvf wordpress.tar       ## ...

  3. 【208】CentOS 下安装 Wine

    参考:centos6.5安装wine 参考:用FreeGate自-由-门软件在Linux上更新Android SDK 参考:CentOS 5.3 使用wine装QQ

  4. Windows可以ping通百度,但是用浏览器打不开网页

    开始——>运行——>输入cmd回车——>输入: netsh winsock reset  命令(重置winsock文件)——>重启系统. 重启完系统,即可解决:如不能,请再查找 ...

  5. HDU 1207 汉诺塔II (简单DP)

    题意:中文题. 析:在没有第四个柱子时,把 n 个盘子搬到第 3 个柱子时,那么2 ^ n -1次,由于多了一根,不知道搬到第四个柱子多少根时是最优的, 所以 dp[i] 表示搬到第4个柱子 i 个盘 ...

  6. E20170429-hm

    fold   n/v 折叠 ribbon n 色带 hover  n. 盘旋; 徘徊; vi犹豫 Roll over 打滚; 折:翻滚   pinch ピンチ 捏,掐; finger フィンガー sc ...

  7. 51nod 1095【映射】

    思路: 利用一个map记录初始的,利用一个map记录排序后的. #include <bits/stdc++.h> using namespace std; map<string,in ...

  8. P5024 保卫王国

    传送门 我现在还是不明白为什么NOIPd2t3会是一道动态dp-- 首先关于动态dp可以看这里 然后这里就是把把矩阵给改一改,改成这个形式\[\left[dp_{i-1,0},dp_{i-1,1}\r ...

  9. Jmeter安装说明

    本文主要介绍Jmeter工具的安装 一.安装JDK 1.下载jdk,到官网下载jdk,下载jkd1.8即可,地址:http://www.oracle.com/technetwork/java/java ...

  10. Hdu 1043 Eight (八数码问题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目描述: 3*3的格子,填有1到8,8个数字,还有一个x,x可以上下左右移动,问最终能否移动 ...