zoukankan      html  css  js  c++  java
  • 如何开发 Laravel 扩展包并发布到 Composer

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

    我们来做一个根据第一个字符或者汉字生成头像的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 CxpAvatar;
    use IlluminateConfigRepository;
    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 CxpAvatar;
    use IlluminateSupportServiceProvider;
    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 CxpAvatarFacades;
    use IlluminateSupportFacadesFacade;
    class Avatar extends Facade
    {
        protected static function getFacadeAccessor()
        {
            return 'avatar';
        }
    }

    使用扩展包

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

    1. 先发布配置文件在config目录下面
    php artisan vendor:publish
    1. 在app/config目录注册我们的服务提供者和门脸类
    'providers' => [
        CxpAvatarAvatarProvider::class,
    ]
    
    'aliases' => [
        'Avatar' => CxpAvatarFacadesAvatar::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的地址就可以了。

    示例代码下载链接

  • 相关阅读:
    HDU 2836 Traversal 简单DP + 树状数组
    UVa 1402 Runtime Error 伸展树
    UVa 11922
    HDU 4358 Boring counting 树状数组+思路
    HDU 4351 Digital root 线段树区间合并
    LA 6187
    UPC 2224 / “浪潮杯”山东省第四届ACM大学生程序设计竞赛 1008 Boring Counting 主席树
    max 宏定义取消:error C2589: error C2059: 语法错误 : “::”
    QT+VTK 对接使用
    标准C++中的string类的用法总结
  • 原文地址:https://www.cnblogs.com/guiyishanren/p/10991255.html
Copyright © 2011-2022 走看看