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 也发布:point_right: [https://packagist.org/]

 

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

 

 

 参考:

https://learnku.com/articles/43112#c297f5

https://www.bbsmax.com/A/QV5ZYGgyJy/

posted @ 2023-01-30 10:51  佚小名  阅读(368)  评论(0编辑  收藏  举报