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号