如何自己开发一个 laravel 的扩展包,供大家使用呢?
我们来做一个根据第一个字符或者汉字生成头像的 laravel 扩展包。其实原理就是我们自己去写一个服务提供者,把服务提供者配置到 app/providers 数组中。
第一步现在自己项目中根目录创建 packages/cxp/avatar/src
修改 composer.json
"psr-4": {
"App\\": "app/",
"Cxp\\Avatar\\": "packages/cxp/avatar/src/"
}
执行 composer dumpautoload
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);
}
}
- 再 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',
];
- 在 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']);
});
}
}
- 如果想使用门脸,可以在 src 目录下创建 Facades 目录,提供门脸
namespace Cxp\Avatar\Facades;
use Illuminate\Support\Facades\Facade;
class Avatar extends Facade
{
protected static function getFacadeAccessor()
{
return 'avatar';
}
}
到此我们开发就完成了,那该怎么使用了
- 先发布配置文件在 config 目录下面
php artisan vendor:publish
- 在 app/config 目录注册我们的服务提供者和门脸类
'providers' => [
Cxp\Avatar\AvatarProvider::class,
]
'aliases' => [
'Avatar' => Cxp\Avatar\Facades\Avatar::class,
]
- 程序中使用
Avatar::output (' 赵 ','zhao.png')
## 如果发布到composer 供大家使用呢
1. 在avatar目录执行composer init,生成composer.json
```php
{
"name": "cxp/laravel-avatar",
"description": "laravel avatar",
"license": "MIT",
"authors": [
{
"name": "cxp1539",
"email": "[email protected]"
}
],
"autoload": {
"psr-4": {
"Cxp\\Avatar\\": "src"
}
},
"require": {}
}
在 github 创建个项目,将 avatar 目录的代码推送到 github 上。
打开 https://packagist.org/ 注册个账号,提交 git 的地址就可以了。
示例代码下载链接
除了上面所说的把你写的 provider 和 Facade 写入到 config/app.php 文件中,你还有一种选择来注册你的 provider 和 Facade,操作很简单,你只需要在你的 composer.json 文件中,加入下面这段:
"extra": {
"laravel": {
"providers": [
"Barryvdh\\Debugbar\\ServiceProvider"
],
"aliases": {
"Debugbar": "Barryvdh\\Debugbar\\Facade"
}
}
}
把你所有的 provider 写入到 providers 中,Facade 写入到 aliases 中,是不是很简单?为啥可以这么做呢?因为在 laravel 框架的引导中,Laravel 会读取 vendor/composer/installed.json,这个文件记录了所有安装的第三包的 composer.json 文件的内容,installed.json 中的每一个元素对应一个 composer 包,Laravel 会逐一解析,这就是上面的方式为什么可以生效的原因,下面这是我项目中的 installed.json 截图:
关于在 composer.json 中提供你的 provider 和 Facade 这部分内容,在 Laravel 的官方文档中也有所概述,Package Development。