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

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

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

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

2.修改 composer.json

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

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


/**
* Created by PhpStorm.
* User: mac
* Date: 2019-01-10
* Time: 14:06
*/
namespace Cxp\Avatar;
use Illuminate\Config\Repository;
class Avatar {
protected $config;
/**
* 构造方法
*/
public function __construct(Repository $config)
{
$this->config = $config->get('avatar');
}
/**
* 生成图像
* @return resource 图片资源
*/
private function generate($name)
{
// 创建图片资源
$img_res = imagecreate($this->config['width'], $this->config['height']);
// 背景颜色
$bg_color = imagecolorallocate($img_res, mt_rand(120, 190), mt_rand(120, 190), mt_rand(120, 190));
// 文字颜色
$font_color = imagecolorallocate($img_res, mt_rand(190, 255), mt_rand(190, 255), mt_rand(190, 255));
// 填充背景色
imagefill($img_res, 1, 1, $bg_color);
// 计算文字的宽高
$pos = imagettfbbox($this->config['size'], 0, $this->config['font_file'], mb_substr($name, 0, 1));
$font_width = $pos[2] - $pos[0] + 0.32 * $this->config['size'];
$font_height = $pos[1] - $pos[5] + -0.16 * $this->config['size'];
// 写入文字
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));
return $img_res;
}
/**
* 输出图片(默认输出到浏览器,给定输出文件位置则输出到文件)
* @param string|false $path 保存路径
*/
public function output($name, $path = false)
{
$img_res = $this->generate($name);
// 确定输出类型和生成用的方法名
$content_type = 'image/' . $this->config['type'];
$generateMethodName = 'image' . $this->config['type'];
// 确定是否输出到浏览器
if (!$path) {
header("Content-type: " . $content_type);
$generateMethodName($img_res);
} else {
$generateMethodName($img_res, $path);
}
// 释放图片内存
imagedestroy($img_res);
}
}
  1. 再src下创建config 目录来存取我们的配置参数文件如config/avatar.php

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

使用扩展包

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

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

发布扩展包

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

{
"name": "cxp/laravel-avatar",
"description": "laravel avatar",
"license": "MIT",
"authors": [
{
"name": "cxp1539",
"email": "457714145@qq.com"
}
],
"autoload": {
"psr-4": {
"Cxp\\Avatar\\": "src"
}
},
"require": {}
}

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. 【扬中集训 DAY4T1】跳马

    [题目链接] 点击打开链接 [算法] 数据范围很大,显然暴力是不能通过的 我们可以先打表,发现答案为 : 41 109 205 325 473 649 853 1085 1345 观察数列的差 68 ...

  2. c/c++内存机制(一)(原)

    一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: (1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效. (2)堆(Heap):由程 ...

  3. 杂项:ASP.NET Core

    ylbtech-杂项:ASP.NET Core 1.返回顶部 1. ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程序.使用 ASP.NET ...

  4. javascript ==等于与===恒等于

    ==判断是否等于,只判断数值 ===代表恒等于,不仅判断数值,而且判断类型 var a=5; var b="5"; (a b 只是数值上相等,但是类型并不相等) a==b //tr ...

  5. TRACE 学习

    TRACE   宏有点象我们以前在C语言中用的Printf函数,使程序在运行过程中输出一些调试信息,使我们能了解程序的一些状态.在Output中可以查看到结果. 但有一点不同的是:TRACE   宏只 ...

  6. spring+mybatis下delete和insert返回值-2147482646

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"&g ...

  7. poj 3734 Blocks【指数型生成函数】

    指数型生成函数,推一推可得: \[ (1+\frac{x^1}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+...)^2+(1+\frac{x^2}{2!}+\frac{x^4 ...

  8. IT兄弟连 Java Web教程 经典面试题

    1.什么是B/S结构?什么是C/S结构? B/S是Browser/Server的缩写客户机上只要安装—个浏览器(Browser)加Netscape Navigator或Internet Explore ...

  9. 函数和代码复用 --Python

    1.关于递归函数的描述,以下选项中正确的是 A.包含一个循环结构 B.函数比较复杂 C.函数内部包含对本函数的再次调用 D.函数名称作为返回值 答案:D 答案解析:递归函数是指函数内部包含对本函数的再 ...

  10. (五)SpringBoot如何定义全局异常

    一:添加业务类异常 创建ServiceException package com.example.demo.core.ret; import java.io.Serializable; /** * @ ...