咱们来作一个根据第一个字符或者汉字生成头像的laravel扩展包。其实原理就是咱们本身去写一个服务提供者,把服务提供者配置到app/providers数组中。php
1.第一步如今本身项目中跟目录建立packages/cxp/avatar/srchtml
2.修改 composer.jsonlaravel
"psr-4": { "App\\": "app/", "Cxp\\Avatar\\": "packages/cxp/avatar/src/" }
-
执行composer dumpautoloadgit
-
src 目录建立 Avatar.php 具体代码github
/** * 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'; } }
使用扩展包
到此咱们开发就完成了,那改怎么使用了。json
- 先发布配置文件在config目录下面
php artisan vendor:publish
- 在app/config目录注册咱们的服务提供者和门脸类
'providers' => [ Cxp\Avatar\AvatarProvider::class, ] 'aliases' => [ 'Avatar' => Cxp\Avatar\Facades\Avatar::class, ]
- 程序中使用
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的地址就能够了。bash
示例代码下载连接并发