人称外号大脸猫
  1. 创建包骨架
# 在项目根目录创建包结构
mkdir -p packages/yourname/greeter/src
cd packages/yourname/greeter 
  1. 初始化包
# 初始化包
composer init \
  --name="yourname/greeter" \
  --description="Simple greeting package" \
  --type="library" \
  --license="MIT"
  1. 创建服务提供者 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,
            ]);
        }
    }
}
  1. 创建核心类 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'],
];
  1. 配置文件 config/greet.php:
<?php
return [
     'default_greeting' => 'Hello',
    'available_styles' => ['default', 'uppercase', 'bold'],
];
  1. 创建门面(可选) src/GreetFacade.php:
<?php

namespace YourName\Greeter\Facades;

use Illuminate\Support\Facades\Facade;

class Greet extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'greeter';
    }
}
  1. 修改 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
}
  1. 在 Laravel 项目中加载包 修改项目根目录的 composer.json:
{
    "repositories": [
        {
            "type": "path",
            "url": "./packages/yourname/greeter"
        }
    ],
    "require": {
        "yourname/greeter": "@dev"
    }
}

安装包:

composer update
  1. 使用示例
// 控制器中使用
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'));
    }
}
  1. 发布配置文件
php artisan vendor:publish --provider="YourName\Greeter\GreetServiceProvider" --tag="greet-config"
  1. 目录结构最终布局
├── 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
copyright ©2025 ahimu.com all rights reserved 皖ICP备19021547号-1