plugins/claude/code/skills/php/SKILL.md
Snider 1b6ea990f4
feat(code): add /core:migrate Laravel migration helpers (#88)
Migrated from host-uk/core-claude#41

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 07:22:17 +00:00

2.8 KiB

name description
core-php Use when creating PHP modules, services, or actions in core-* packages.

PHP Framework Patterns

Host UK PHP modules follow strict conventions. Use core php commands.

Module Structure

core-{name}/
├── src/
│   ├── Core/              # Namespace: Core\{Name}
│   │   ├── Boot.php       # Module bootstrap (listens to lifecycle events)
│   │   ├── Actions/       # Single-purpose business logic
│   │   └── Models/        # Eloquent models
│   └── Mod/               # Namespace: Core\Mod\{Name} (optional extensions)
├── resources/views/       # Blade templates
├── routes/                # Route definitions
├── database/migrations/   # Migrations
├── tests/                 # Pest tests
└── composer.json

Boot Class Pattern

<?php

declare(strict_types=1);

namespace Core\{Name};

use Core\Php\Events\WebRoutesRegistering;
use Core\Php\Events\AdminPanelBooting;

class Boot
{
    public static array $listens = [
        WebRoutesRegistering::class => 'onWebRoutes',
        AdminPanelBooting::class => ['onAdmin', 10],  // With priority
    ];

    public function onWebRoutes(WebRoutesRegistering $event): void
    {
        $event->router->middleware('web')->group(__DIR__ . '/../routes/web.php');
    }

    public function onAdmin(AdminPanelBooting $event): void
    {
        $event->panel->resources([...]);
    }
}

Action Pattern

<?php

declare(strict_types=1);

namespace Core\{Name}\Actions;

use Core\Php\Action;

class CreateThing
{
    use Action;

    public function handle(User $user, array $data): Thing
    {
        return Thing::create([
            'user_id' => $user->id,
            ...$data,
        ]);
    }
}

// Usage: CreateThing::run($user, $validated);

Multi-Tenant Models

<?php

declare(strict_types=1);

namespace Core\{Name}\Models;

use Core\Tenant\Concerns\BelongsToWorkspace;
use Illuminate\Database\Eloquent\Model;

class Thing extends Model
{
    use BelongsToWorkspace;  // Auto-scopes queries, sets workspace_id

    protected $fillable = ['name', 'workspace_id'];
}

Commands

Task Command
Run tests core php test
Format core php fmt --fix
Analyse core php analyse
Dev server core php dev
Create migration /core:migrate create <name>
Create migration from model /core:migrate from-model <model>
Run migrations /core:migrate run
Rollback migrations /core:migrate rollback
Refresh migrations /core:migrate fresh
Migration status /core:migrate status

Rules

  • Always declare(strict_types=1);
  • UK English: colour, organisation, centre
  • Type hints on all parameters and returns
  • Pest for tests, not PHPUnit
  • Flux Pro for UI, not vanilla Alpine