- 创建包骨架
# 在项目根目录创建包结构
mkdir -p packages/yourname/greeter/src
cd packages/yourname/greeter
- 初始化包
# 初始化包
composer init \
--name="yourname/greeter" \
--description="Simple greeting package" \
--type="library" \
--license="MIT"
- 创建服务提供者 src/GreetServiceProvider.php:
// 1. 服务提供者优化 (src/GreetServiceProvider.php)
<?php
namespace YourName\Greeter;
use Illuminate\Support\ServiceProvider;
class GreetServiceProvider extends ServiceProvider
{
public function register()
{
$this->mergeConfigFrom(__DIR__.'/../config/greet.php', 'greet');
$this->app->singleton('greeter', function ($app) {
return new Greeter(config('greet.default_greeting'));
});
}
public function boot()
{
if ($this->app->runningInConsole()) {
$this->publishes([
__DIR__.'/../config/greet.php' => config_path('greet.php'),
], 'greet-config');
// 添加命令注册(可选)
$this->commands([
Console\GreetCommand::class,
]);
}
}
}
- 创建核心类 src/Greeter.php:
<?php
namespace YourName\Greeter;
class Greeter
{
protected $greeting;
protected $style = 'default';
public function __construct($greeting)
{
$this->greeting = $greeting;
}
public function greet(string $name): string
{
$formatted = "{$this->greeting}, {$name}!";
return $this->applyStyle($formatted);
}
public function setStyle(string $style): self
{
$this->style = $style;
return $this;
}
protected function applyStyle(string $text): string
{
return match($this->style) {
'uppercase' => strtoupper($text),
'bold' => "<b>{$text}</b>",
default => $text
};
}
}
// 3. 添加控制台命令 (src/Console/GreetCommand.php)
namespace YourName\Greeter\Console;
use Illuminate\Console\Command;
use YourName\Greeter\Greeter;
class GreetCommand extends Command
{
protected $signature = 'greet {name} {--style=}';
protected $description = 'Generate a greeting';
public function handle(Greeter $greeter)
{
if ($this->option('style')) {
$greeter->setStyle($this->option('style'));
}
$this->info($greeter->greet($this->argument('name')));
}
}
// 4. 配置文件增强 (config/greet.php)
return [
'default_greeting' => 'Hello',
'available_styles' => ['default', 'uppercase', 'bold'],
];
- 配置文件 config/greet.php:
<?php
return [
'default_greeting' => 'Hello',
'available_styles' => ['default', 'uppercase', 'bold'],
];
- 创建门面(可选) src/GreetFacade.php:
<?php
namespace YourName\Greeter\Facades;
use Illuminate\Support\Facades\Facade;
class Greet extends Facade
{
protected static function getFacadeAccessor()
{
return 'greeter';
}
}
- 修改 Composer 配置
{
"name": "yourname/greeter",
"description": "Simple greeting package for Laravel",
"type": "library",
"require": {
"php": "^8.1",
"laravel/framework": "^10.0"
},
"autoload": {
"psr-4": {
"YourName\\Greeter\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"YourName\\Greeter\\Tests\\": "tests/"
}
},
"extra": {
"laravel": {
"providers": [
"YourName\\Greeter\\GreetServiceProvider"
],
"aliases": {
"Greet": "YourName\\Greeter\\Facades\\Greet"
}
}
},
"minimum-stability": "dev",
"prefer-stable": true
}
- 在 Laravel 项目中加载包 修改项目根目录的 composer.json:
{
"repositories": [
{
"type": "path",
"url": "./packages/yourname/greeter"
}
],
"require": {
"yourname/greeter": "@dev"
}
}
安装包:
composer update
- 使用示例
// 控制器中使用
namespace YourName\Greeter\Tests;
use YourName\Greeter\Greeter;
use Orchestra\Testbench\TestCase;
class GreeterTest extends TestCase
{
protected function getPackageProviders($app)
{
return [\YourName\Greeter\GreetServiceProvider::class];
}
public function test_greeting_output()
{
$greeter = new Greeter('Hi');
$this->assertEquals('Hi, John!', $greeter->greet('John'));
}
public function test_style_application()
{
$greeter = (new Greeter('Hello'))->setStyle('uppercase');
$this->assertEquals('HELLO, SARAH!', $greeter->greet('Sarah'));
}
}
- 发布配置文件
php artisan vendor:publish --provider="YourName\Greeter\GreetServiceProvider" --tag="greet-config"
- 目录结构最终布局
├── packages
│ └── yourname
│ └── greeter
│ ├── src
│ │ ├── Greeter.php
│ │ ├── GreetServiceProvider.php
│ │ └── GreetFacade.php
│ └── composer.json
| └── config
│ └── greet.php
├── composer.json
└── ...
添加README.md:
# Laravel Greeter 包
简单问候语生成包,支持多种输出样式
安装
composer require yourname/greeter