604 lines
13 KiB
Markdown
604 lines
13 KiB
Markdown
# Creating the Core PHP Framework Template Repository
|
|
|
|
This guide explains how to create the `host-uk/core-template` GitHub template repository that `php artisan core:new` will use to scaffold new projects.
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
The template repository is a minimal Laravel application pre-configured with Core PHP Framework packages. Users run:
|
|
|
|
```bash
|
|
php artisan core:new my-project
|
|
```
|
|
|
|
This clones the template, configures it, and installs dependencies automatically.
|
|
|
|
---
|
|
|
|
## Repository Structure
|
|
|
|
```
|
|
host-uk/core-template/
|
|
├── app/
|
|
│ ├── Console/
|
|
│ ├── Http/
|
|
│ ├── Models/
|
|
│ └── Providers/
|
|
├── bootstrap/
|
|
│ └── app.php # Core packages registered here
|
|
├── config/
|
|
│ ├── app.php
|
|
│ ├── database.php
|
|
│ └── core.php # Core framework config
|
|
├── database/
|
|
│ ├── migrations/
|
|
│ └── seeders/
|
|
├── public/
|
|
├── resources/
|
|
│ ├── views/
|
|
│ └── css/
|
|
├── routes/
|
|
│ ├── api.php
|
|
│ ├── console.php
|
|
│ └── web.php
|
|
├── storage/
|
|
├── tests/
|
|
├── .env.example
|
|
├── .gitignore
|
|
├── composer.json # Pre-configured with Core packages
|
|
├── package.json
|
|
├── phpunit.xml
|
|
├── README.md
|
|
└── vite.config.js
|
|
```
|
|
|
|
---
|
|
|
|
## Step 1: Create Base Laravel App
|
|
|
|
```bash
|
|
# Create fresh Laravel 12 app
|
|
composer create-project laravel/laravel core-template
|
|
cd core-template
|
|
```
|
|
|
|
---
|
|
|
|
## Step 2: Configure composer.json
|
|
|
|
Update `composer.json` to require Core PHP packages:
|
|
|
|
```json
|
|
{
|
|
"name": "host-uk/core-template",
|
|
"type": "project",
|
|
"description": "Core PHP Framework - Project Template",
|
|
"keywords": ["laravel", "core-php", "modular", "framework", "template"],
|
|
"license": "EUPL-1.2",
|
|
"require": {
|
|
"php": "^8.2",
|
|
"laravel/framework": "^12.0",
|
|
"laravel/tinker": "^2.10",
|
|
"livewire/flux": "^2.0",
|
|
"livewire/flux-pro": "^2.10",
|
|
"livewire/livewire": "^3.0",
|
|
"host-uk/core": "^1.0",
|
|
"host-uk/core-admin": "^1.0",
|
|
"host-uk/core-api": "^1.0",
|
|
"host-uk/core-mcp": "^1.0"
|
|
},
|
|
"require-dev": {
|
|
"fakerphp/faker": "^1.23",
|
|
"laravel/pail": "^1.2",
|
|
"laravel/pint": "^1.18",
|
|
"laravel/sail": "^1.41",
|
|
"mockery/mockery": "^1.6",
|
|
"nunomaduro/collision": "^8.6",
|
|
"phpunit/phpunit": "^11.5"
|
|
},
|
|
"autoload": {
|
|
"psr-4": {
|
|
"App\\": "app/",
|
|
"Website\\": "app/Website/",
|
|
"Database\\Factories\\": "database/factories/",
|
|
"Database\\Seeders\\": "database/seeders/"
|
|
}
|
|
},
|
|
"autoload-dev": {
|
|
"psr-4": {
|
|
"Tests\\": "tests/"
|
|
}
|
|
},
|
|
"repositories": [
|
|
{
|
|
"name": "flux-pro",
|
|
"type": "composer",
|
|
"url": "https://composer.fluxui.dev"
|
|
}
|
|
],
|
|
"scripts": {
|
|
"post-autoload-dump": [
|
|
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
|
|
"@php artisan package:discover --ansi"
|
|
],
|
|
"post-update-cmd": [
|
|
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
|
|
],
|
|
"post-root-package-install": [
|
|
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
|
|
],
|
|
"post-create-project-cmd": [
|
|
"@php artisan key:generate --ansi",
|
|
"@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
|
|
"@php artisan migrate --graceful --ansi"
|
|
]
|
|
},
|
|
"extra": {
|
|
"laravel": {
|
|
"dont-discover": []
|
|
}
|
|
},
|
|
"config": {
|
|
"optimize-autoloader": true,
|
|
"preferred-install": "dist",
|
|
"sort-packages": true,
|
|
"allow-plugins": {
|
|
"php-http/discovery": true
|
|
}
|
|
},
|
|
"minimum-stability": "stable",
|
|
"prefer-stable": true
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Step 3: Update bootstrap/app.php
|
|
|
|
Register Core PHP packages:
|
|
|
|
```php
|
|
<?php
|
|
|
|
use Illuminate\Foundation\Application;
|
|
use Illuminate\Foundation\Configuration\Exceptions;
|
|
use Illuminate\Foundation\Configuration\Middleware;
|
|
|
|
return Application::configure(basePath: dirname(__DIR__))
|
|
->withProviders([
|
|
// Core PHP Framework Packages
|
|
Core\CoreServiceProvider::class,
|
|
Core\Mod\Admin\Boot::class,
|
|
Core\Mod\Api\Boot::class,
|
|
Core\Mod\Mcp\Boot::class,
|
|
])
|
|
->withRouting(
|
|
web: __DIR__.'/../routes/web.php',
|
|
api: __DIR__.'/../routes/api.php',
|
|
commands: __DIR__.'/../routes/console.php',
|
|
health: '/up',
|
|
)
|
|
->withMiddleware(function (Middleware $middleware) {
|
|
//
|
|
})
|
|
->withExceptions(function (Exceptions $exceptions) {
|
|
//
|
|
})->create();
|
|
```
|
|
|
|
---
|
|
|
|
## Step 4: Create config/core.php
|
|
|
|
```php
|
|
<?php
|
|
|
|
return [
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Core PHP Framework Configuration
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
'module_paths' => [
|
|
base_path('packages/core-php/src/Mod'),
|
|
base_path('packages/core-php/src/Core'),
|
|
base_path('app/Mod'),
|
|
],
|
|
|
|
'services' => [
|
|
'cache_discovery' => env('CORE_CACHE_DISCOVERY', true),
|
|
],
|
|
|
|
'cdn' => [
|
|
'enabled' => env('CDN_ENABLED', false),
|
|
'driver' => env('CDN_DRIVER', 'bunny'),
|
|
],
|
|
];
|
|
```
|
|
|
|
---
|
|
|
|
## Step 5: Update .env.example
|
|
|
|
Add Core PHP specific variables:
|
|
|
|
```env
|
|
APP_NAME="Core PHP App"
|
|
APP_ENV=local
|
|
APP_KEY=
|
|
APP_DEBUG=true
|
|
APP_TIMEZONE=UTC
|
|
APP_URL=http://localhost
|
|
|
|
APP_LOCALE=en_GB
|
|
APP_FALLBACK_LOCALE=en_GB
|
|
APP_FAKER_LOCALE=en_GB
|
|
|
|
DB_CONNECTION=sqlite
|
|
# DB_HOST=127.0.0.1
|
|
# DB_PORT=3306
|
|
# DB_DATABASE=core
|
|
# DB_USERNAME=root
|
|
# DB_PASSWORD=
|
|
|
|
# Core PHP Framework
|
|
CORE_CACHE_DISCOVERY=true
|
|
|
|
# CDN Configuration
|
|
CDN_ENABLED=false
|
|
CDN_DRIVER=bunny
|
|
BUNNYCDN_API_KEY=
|
|
BUNNYCDN_STORAGE_ZONE=
|
|
BUNNYCDN_PULL_ZONE=
|
|
|
|
# Flux Pro (optional)
|
|
FLUX_LICENSE_KEY=
|
|
```
|
|
|
|
---
|
|
|
|
## Step 6: Create README.md
|
|
|
|
```markdown
|
|
# Core PHP Framework Project
|
|
|
|
A modular monolith Laravel application built with Core PHP Framework.
|
|
|
|
## Features
|
|
|
|
✅ **Core Framework** - Event-driven module system with lazy loading
|
|
✅ **Admin Panel** - Livewire-powered admin interface with Flux UI
|
|
✅ **REST API** - Scoped API keys, rate limiting, webhooks, OpenAPI docs
|
|
✅ **MCP Tools** - Model Context Protocol for AI agent integration
|
|
|
|
## Installation
|
|
|
|
### From Template (Recommended)
|
|
|
|
```bash
|
|
# Using the core:new command
|
|
php artisan core:new my-project
|
|
|
|
# Or manually clone
|
|
git clone https://github.com/host-uk/core-template.git my-project
|
|
cd my-project
|
|
composer install
|
|
php artisan core:install
|
|
```
|
|
|
|
### Requirements
|
|
|
|
- PHP 8.2+
|
|
- Composer 2.x
|
|
- SQLite (default) or MySQL/PostgreSQL
|
|
- Node.js 18+ (for frontend assets)
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# 1. Install dependencies
|
|
composer install
|
|
npm install
|
|
|
|
# 2. Configure environment
|
|
cp .env.example .env
|
|
php artisan key:generate
|
|
|
|
# 3. Set up database
|
|
touch database/database.sqlite
|
|
php artisan migrate
|
|
|
|
# 4. Start development server
|
|
php artisan serve
|
|
```
|
|
|
|
Visit: http://localhost:8000
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
app/
|
|
├── Mod/ # Your custom modules
|
|
├── Website/ # Multi-site website modules
|
|
└── Providers/ # Laravel service providers
|
|
|
|
config/
|
|
└── core.php # Core framework configuration
|
|
|
|
routes/
|
|
├── web.php # Public web routes
|
|
├── api.php # REST API routes (via core-api)
|
|
└── console.php # Artisan commands
|
|
```
|
|
|
|
## Creating Modules
|
|
|
|
```bash
|
|
# Create a new module with all features
|
|
php artisan make:mod Blog --all
|
|
|
|
# Create module with specific features
|
|
php artisan make:mod Shop --web --api --admin
|
|
```
|
|
|
|
Modules follow the event-driven pattern:
|
|
|
|
```php
|
|
<?php
|
|
namespace Mod\Blog;
|
|
|
|
class Boot
|
|
{
|
|
public static array $listens = [
|
|
WebRoutesRegistering::class => 'onWebRoutes',
|
|
ApiRoutesRegistering::class => 'onApiRoutes',
|
|
AdminPanelBooting::class => 'onAdminPanel',
|
|
];
|
|
|
|
public function onWebRoutes(WebRoutesRegistering $event): void
|
|
{
|
|
$event->routes(fn() => require __DIR__.'/Routes/web.php');
|
|
}
|
|
}
|
|
```
|
|
|
|
## Core Packages
|
|
|
|
- **host-uk/core** - Core framework components
|
|
- **host-uk/core-admin** - Admin panel with Livewire modals
|
|
- **host-uk/core-api** - REST API with scopes & webhooks
|
|
- **host-uk/core-mcp** - Model Context Protocol tools for AI
|
|
|
|
## Documentation
|
|
|
|
- [Core PHP Framework](https://github.com/host-uk/core-php)
|
|
- [Admin Package](https://github.com/host-uk/core-admin)
|
|
- [API Package](https://github.com/host-uk/core-api)
|
|
- [MCP Package](https://github.com/host-uk/core-mcp)
|
|
|
|
## License
|
|
|
|
EUPL-1.2 (European Union Public Licence)
|
|
```
|
|
|
|
---
|
|
|
|
## Step 7: Add .gitattributes
|
|
|
|
```gitattributes
|
|
* text=auto
|
|
|
|
*.blade.php diff=html
|
|
*.css diff=css
|
|
*.html diff=html
|
|
*.md diff=markdown
|
|
*.php diff=php
|
|
|
|
/.github export-ignore
|
|
CHANGELOG.md export-ignore
|
|
```
|
|
|
|
---
|
|
|
|
## Step 8: Create GitHub Repository
|
|
|
|
### On GitHub:
|
|
|
|
1. **Create new repository**
|
|
- Name: `core-template`
|
|
- Description: "Core PHP Framework - Project Template"
|
|
- Public repository
|
|
- ✅ Check "Template repository"
|
|
|
|
2. **Push your code**
|
|
|
|
```bash
|
|
git init
|
|
git add .
|
|
git commit -m "Initial Core PHP Framework template"
|
|
git branch -M main
|
|
git remote add origin https://github.com/host-uk/core-template.git
|
|
git push -u origin main
|
|
```
|
|
|
|
3. **Configure template settings**
|
|
- Go to Settings → General
|
|
- Under "Template repository", enable checkbox
|
|
- Add topics: `laravel`, `core-php`, `modular-monolith`, `template`
|
|
|
|
4. **Create releases**
|
|
- Tag: `v1.0.0`
|
|
- Title: "Core PHP Framework Template v1.0.0"
|
|
- Include changelog
|
|
|
|
---
|
|
|
|
## Step 9: Test Template Creation
|
|
|
|
```bash
|
|
# Test the template works
|
|
php artisan core:new test-project
|
|
|
|
# Should create:
|
|
# - test-project/ directory
|
|
# - Run composer install
|
|
# - Run core:install
|
|
# - Initialize git repo
|
|
|
|
cd test-project
|
|
php artisan serve
|
|
```
|
|
|
|
---
|
|
|
|
## Additional Template Variants
|
|
|
|
You can create specialized templates:
|
|
|
|
### API-Only Template
|
|
**Repository:** `host-uk/core-api-template`
|
|
**Usage:** `php artisan core:new my-api --template=host-uk/core-api-template`
|
|
|
|
Includes only:
|
|
- core
|
|
- core-api
|
|
- Minimal routes (API only)
|
|
|
|
### Admin-Only Template
|
|
**Repository:** `host-uk/core-admin-template`
|
|
**Usage:** `php artisan core:new my-admin --template=host-uk/core-admin-template`
|
|
|
|
Includes only:
|
|
- core
|
|
- core-admin
|
|
- Auth scaffolding
|
|
|
|
### SaaS Template
|
|
**Repository:** `host-uk/core-saas-template`
|
|
**Usage:** `php artisan core:new my-saas --template=host-uk/core-saas-template`
|
|
|
|
Includes:
|
|
- All core packages
|
|
- Multi-tenancy pre-configured
|
|
- Billing integration stubs
|
|
- Feature flags
|
|
|
|
---
|
|
|
|
## Updating the Template
|
|
|
|
When you release new core package versions:
|
|
|
|
1. Update `composer.json` with new version constraints
|
|
2. Update `.env.example` with new config options
|
|
3. Update `README.md` with new features
|
|
4. Tag a new release: `v1.1.0`, `v1.2.0`, etc.
|
|
|
|
Users can specify template versions:
|
|
|
|
```bash
|
|
php artisan core:new my-project --template=host-uk/core-template --branch=v1.0.0
|
|
```
|
|
|
|
---
|
|
|
|
## GitHub Actions (Optional)
|
|
|
|
Add `.github/workflows/test-template.yml` to test template on every commit:
|
|
|
|
```yaml
|
|
name: Test Template
|
|
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: 8.2
|
|
extensions: sqlite3
|
|
|
|
- name: Install Dependencies
|
|
run: composer install --no-interaction --prefer-dist
|
|
|
|
- name: Copy .env
|
|
run: cp .env.example .env
|
|
|
|
- name: Generate Key
|
|
run: php artisan key:generate
|
|
|
|
- name: Create Database
|
|
run: touch database/database.sqlite
|
|
|
|
- name: Run Migrations
|
|
run: php artisan migrate --force
|
|
|
|
- name: Run Tests
|
|
run: php artisan test
|
|
```
|
|
|
|
---
|
|
|
|
## Maintenance
|
|
|
|
### Regular Updates
|
|
|
|
- **Monthly:** Update Laravel & core package versions
|
|
- **Security:** Apply security patches immediately
|
|
- **Testing:** Test template creation works after updates
|
|
|
|
### Community Templates
|
|
|
|
Encourage community to create their own templates:
|
|
|
|
```bash
|
|
# Community members can create templates like:
|
|
php artisan core:new my-blog --template=johndoe/core-blog-template
|
|
php artisan core:new my-shop --template=acme/core-ecommerce
|
|
```
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
For issues with the template:
|
|
- **GitHub Issues:** https://github.com/host-uk/core-template/issues
|
|
- **Discussions:** https://github.com/host-uk/core-php/discussions
|
|
|
|
---
|
|
|
|
## Checklist
|
|
|
|
Before publishing the template:
|
|
|
|
- [ ] All core packages install without errors
|
|
- [ ] `php artisan core:install` runs successfully
|
|
- [ ] Database migrations work
|
|
- [ ] `php artisan serve` starts server
|
|
- [ ] Admin panel accessible at `/admin`
|
|
- [ ] API routes respond correctly
|
|
- [ ] MCP tools registered
|
|
- [ ] README.md is clear and helpful
|
|
- [ ] .env.example has all required variables
|
|
- [ ] Repository is marked as "Template repository"
|
|
- [ ] v1.0.0 release is tagged
|
|
- [ ] License file is included (EUPL-1.2)
|
|
|
|
---
|
|
|
|
**Template Ready!** 🚀
|
|
|
|
Users can now run:
|
|
|
|
```bash
|
|
php artisan core:new my-awesome-project
|
|
```
|
|
|
|
And get a fully configured Core PHP Framework application in seconds.
|