laravel composer扩展包的开发到发布
1、通过 Composer 创建项目
composer create-project --prefer-dist laravel/laravel pkg
2、新建目录
接着进入此项目中,创建目录 packages/{your_name}/{your_package_name}
mkdir -p packages/you_name/unlimited
 然后再进入扩展包目录,进行 composer 初始化:
cd packages/everan/unlimited composer init

按着提示来输入信息,得到的 comoposer 内容大概如下:
{
    "name": "dyn/unlimited",
    "description": "This is a unlimited classified",
    "type": "project",
    "autoload": {
        "psr-4": {
            "Dyn\\Unlimited\\": "src/"
        }
    },
    "authors": [
        {
            "name": "dyn"
        }
    ],
    "minimum-stability": "dev",
    "require": {}
}
此时扩展包目录大致如下:
dyn/unlimited
                ├── src  # 逻辑代码文件夹
                ├── tests # 测试用例文件夹
                ├── README.md
                ├── composer.json
在src下创建config 目录来存取我们的配置参数文件如config/unlimited.php
<?php  
return   [
    'parent_key' => 'pid', 
    'child_key' => 'child', 
];
?>
3、编写扩展包业务逻辑代码
src 目录创建 Unlimited.php 具体代码
<?php  
namespace Dyn\Unlimited;
use Illuminate\Config\Repository;
class Unlimited {
    protected $config;
    /**
     * 构造方法
     */
    public function __construct(Repository $config)
    {
        $this->config = $config->get('unlimited');
    }
    public function getUnlimited($data)
    {
        $parent_key=$this->config['parent_key'];
        $child_key=$this->config['child_key'];
        $data = array_column($data, null, 'id');
        $tree = [];
        foreach ($data as $key => $val) {
            if ($val[$parent_key] == 0) {
                $tree[] = &$data[$key];
            } else {
                $data[$val[$parent_key]][$child_key][] = &$data[$key];
            }
        }
        return $tree;
    }
}
在src创建UnlimitedServiceProvider.php即服务提供者。供ioc容器注册
<?php  
namespace Dyn\Unlimited;
use Illuminate\Support\ServiceProvider;
class UnlimitedServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        // 发布配置文件
        $this->publishes([
            __DIR__.'/config/unlimited.php' => config_path('unlimited.php'),
        ]);
    }
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('unlimited', function ($app) {
            return new Unlimited($app['config']);
        });
    }
}
如果想使用门脸,可以在src目录下创建Facades目录,提供门脸
<?php
namespace Dyn\Unlimited\Facades;
use Illuminate\Support\Facades\Facade;
class Unlimited extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'unlimited';
    }
}
使用扩展包
到这里扩展包就基本算开发好了,接下来我们开始进行本地安装和测试。
本地测试
手动把服务类 UnlimitedServiceProvider 添加到项目的 config/app.php providers 数组中:
'providers' => [
    ·
    ·
    ·
    Dyn\Unlimited\UnlimitedProvider::class,
],
'aliases' => [
    ·    
    ·
    ·
        'Unlimited' => Dyn\Unlimited\Facades\Unlimited::class,
    ],
接着修改根目录里的 composer 的配置pkg/composer.json
"autoload": {
        ·
        ·
        "psr-4": {
            ·
            ·
            "Dyn\\Unlimited\\": "packages/dyn/unlimited/src/"
        }
    },
发布配置文件在config目录下面
php artisan vendor:publish
最后在根目录执行命令:
composer dump-autoload
测试
根目录执行
php artisan tinker
接着输入代码:
$data = [
    ['id'=>1,'pid'=>0,'name'=>1],
    ['id'=>2,'pid'=>0,'name'=>2],
    ['id'=>3,'pid'=>1,'name'=>3],
    ['id'=>4,'pid'=>2,'name'=>4],
    ['id'=>5,'pid'=>3,'name'=>5],
    ['id'=>6,'pid'=>4,'name'=>6],
    ['id'=>7,'pid'=>5,'name'=>7],
    ['id'=>8,'pid'=>6,'name'=>8],
];
app('unlimited')->getUnlimited($data);
然后需要设置下,扩展包被其他朋友下载使用的时候能够实现自动添加服务,我们的则做如下修改:
packages/everan/unlimited/composer.json
    ·
    ·
"extra": {
    "laravel": {
        "providers": [
            "Dyn\\Unlimited\\UnlimitedServiceProvider"
        ]
    }
}
扩展包发布
1、首先把扩展包发布到github
 
 接着再 Packagist 也发布
 [https://packagist.org/]

在github创建release,创建完后在packagist点击更新即可


参考:
https://learnku.com/articles/43112#c297f5
https://www.bbsmax.com/A/QV5ZYGgyJy/
                    
                
                
            
        
浙公网安备 33010602011771号