Skip to content

Latest commit

Β 

History

History
377 lines (290 loc) Β· 12.8 KB

File metadata and controls

377 lines (290 loc) Β· 12.8 KB

Latest Stable Version Total Downloads License PHP8 Ready Unit Tests Code Quality Maintenance

SPIN Framework Logo

A super lightweight, modern PHP framework for building web applications and REST APIs

πŸš€ About SPIN Framework

SPIN is a lightweight, high-performance PHP framework designed for building modern web applications and REST APIs. Built with PHP 8+ and following PSR standards, SPIN provides a clean, intuitive foundation for developers who want speed, flexibility, and simplicity without the overhead of larger frameworks.

✨ Why Choose SPIN?

  • πŸš€ Lightning Fast - Minimal overhead, optimized for performance
  • πŸ”§ PSR Compliant - Built on industry standards for maximum compatibility
  • πŸ“± Modern PHP 8+ - Leverages the latest PHP features and performance improvements
  • πŸ”„ Flexible Architecture - Easy to extend and customize for your specific needs
  • πŸ“š Comprehensive - Built-in support for routing, middleware, caching, databases, and more
  • 🌐 Platform Agnostic - Works seamlessly on Windows, Linux, and macOS

πŸ“‹ Requirements

  • PHP: 8.0 or higher
  • Extensions: PDO, JSON, OpenSSL, Mbstring
  • Web Server: Apache, Nginx, or any PSR-7 compatible server
  • Database: MySQL, PostgreSQL, SQLite, CockroachDB, Firebird, or any PDO-compatible database

πŸ› οΈ Installation

Quick Start with Composer

composer require celarius/spin-framework

Using the SPIN Skeleton (Recommended)

For the best development experience, start with our official skeleton project:

# Clone the skeleton
git clone https://github.com/Celarius/spin-skeleton.git my-spin-app
cd my-spin-app

# Install dependencies
composer install

# Start development server
php -S localhost:8000 -t src/public

πŸ—οΈ Project Structure

my-spin-app/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ app/
β”‚   β”‚   β”œβ”€β”€ Config/           # Configuration files
β”‚   β”‚   β”œβ”€β”€ Controllers/      # Controllers
β”‚   β”‚   β”œβ”€β”€ Middlewares/      # Custom middleware
β”‚   β”‚   β”œβ”€β”€ Views/            # Template files
β”‚   β”‚   └── Globals.php       # Global functions
β”‚   β”œβ”€β”€ public/               # Web root directory
β”‚   β”‚   β”œβ”€β”€ bootstrap.php     # Application entry point
β”‚   └── storage/              # Application storage
β”‚       β”œβ”€β”€ logs/             # Log files
β”‚       β”œβ”€β”€ cache/            # Optional. Cache files
β”œβ”€β”€ vendor/                   # Composer dependencies
β”œβ”€β”€ composer.json             # Project dependencies

πŸš€ Getting Started

1. Configuration

SPIN uses JSON-based configuration files, in the /Config folder, named after the environment config-<env>.json:

{
  "application": {
    "global": {
      "maintenance": false,
      "timezone": "Europe/Stockholm"
    },
    "secret": "${env:APPLICATION_SECRET}"
  },
  "session": {
    "cookie": "SID",
    "timeout": 3600,
    "driver": "apcu"
  },
  "logger": {
    "level": "notice",
    "driver": "php"
  }
}

Configuration files support ${env:<varName>} macros for environment variables in values

2. Routing

Routes are defined in JSON configuration files:

{
  "common": {
    "before": ["\\App\\Middlewares\\RequestIdBeforeMiddleware"],
    "after": ["\\App\\Middlewares\\ResponseLogAfterMiddleware"]
  },
  "groups": [
    {
      "name": "Public API",
      "prefix": "/api/v1",
      "before": ["\\App\\Middlewares\\CorsBeforeMiddleware"],
      "routes": [
        { "methods": ["GET"], "path": "/health", "handler": "\\App\\Controllers\\Api\\HealthController" }
      ]
    },
    {
      "name": "Protected API",
      "prefix": "/api/v1",
      "before": ["\\App\\Middlewares\\AuthHttpBeforeMiddleware"],
      "routes": [
        { "methods": ["GET"], "path": "/users/{id}", "handler": "\\App\\Controllers\\Api\\UserController" }
      ]
    }
  ]
}

3. Controllers

Controllers extend SPIN's base classes and use specific HTTP method handlers:

<?php declare(strict_types=1);

namespace App\Controllers;

use \App\Controllers\AbstractPlatesController;

class IndexController extends AbstractPlatesController
{
    public function handleGET(array $args)
    {
        $model = ['title' => 'Welcome to SPIN', 'user' => 'Guest'];
        $html = $this->engine->render('pages::index', $model);
        return response($html);
    }
}

4. Middleware

Middleware extends Spin\Core\Middleware:

<?php declare(strict_types=1);

namespace App\Middlewares;

use Spin\Core\Middleware;

class AuthMiddleware extends Middleware
{
    public function initialize(array $args): bool
    {
        $this->secret = config('application.secret');
        return true;
    }

    public function handle(array $args): bool
    {
        $token = getRequest()->getHeaderLine('Authorization');
        if (!$this->validateToken($token)) {
            responseJson(['error' => 'Unauthorized'], 401);
            return false;
        }
        return true;
    }
}

πŸ”§ Core Features

πŸ›£οΈ JSON-Based Routing

  • Route Groups - Organize routes with shared middleware and prefixes
  • HTTP Method Support - Full support for GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
  • Dynamic Parameters - Capture URL parameters with {paramName} syntax
  • Middleware Integration - Apply middleware at common, group, or route level

πŸ”Œ Middleware System

  • Common Middleware - Applied to all requests globally
  • Group Middleware - Applied to specific route groups
  • Route Middleware - Applied to individual routes
  • SPIN-Specific - Uses initialize() and handle() methods

πŸ—„οΈ Database Support

  • Multiple Drivers - MySQL, PostgreSQL, SQLite, CockroachDB, Firebird
  • PDO Based - Secure, prepared statements by default
  • Connection Management - Efficient database connection handling
  • JSON Configuration - Database settings in configuration files

πŸ’Ύ Caching

  • PSR-16 Compatible - Standard cache interface
  • Multiple Adapters - APCu, Redis, File-based caching
  • JSON Configuration - Cache settings in configuration files
  • Performance Optimized - Minimal overhead for maximum speed

πŸ“ File Management

  • Secure Uploads - Built-in security and validation
  • Multiple Storage Backends - Local, cloud, or custom storage
  • File Processing - Image manipulation, document processing
  • Access Control - Fine-grained permissions and security

πŸ“š Documentation

Complete documentation is available in the doc/ directory. Quick navigation:

Topic Resources
Getting Started Quick Start β€’ Core Concepts β€’ Your First App
User Guide Configuration β€’ Routing β€’ Middleware β€’ Databases β€’ Cache
Development Security β€’ Testing β€’ Helpers β€’ File Uploads
Best Practices Application Design β€’ Error Handling β€’ Performance β€’ Database Patterns
Recipes & Examples Authentication β€’ CORS Handling β€’ Rate Limiting β€’ Deployment
API Reference Core Classes & Functions

Browse doc/README.md for the complete documentation index.

πŸ§ͺ Testing

Run Tests

# Windows
.\phpunit.cmd

# Linux/macOS
./vendor/bin/phpunit

# With coverage report
./vendor/bin/phpunit --coverage-html coverage/

Test Structure

tests/
β”œβ”€β”€ Unit/              # Unit tests
β”œβ”€β”€ Integration/       # Integration tests
β”œβ”€β”€ Feature/           # Feature tests
└── bootstrap.php      # Test bootstrap

🌐 Web Server Configuration

Apache Configuration

<VirtualHost *:80>
    ServerName mydomain.com
    DocumentRoot "/path/to/your/app/src/public"

    <Directory "/path/to/your/app/src/public">
        AllowOverride All
        Require all granted

        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ bootstrap.php [QSA,L]
    </Directory>
</VirtualHost>

Nginx Configuration

server {
    listen 80;
    server_name mydomain.com;
    root /path/to/your/app/src/public;
    index bootstrap.php;

    location / {
        try_files $uri $uri/ /bootstrap.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index bootstrap.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

πŸ”Œ PSR Standards Support

SPIN Framework is built on PSR standards for maximum compatibility:

  • PSR-3 - Logger Interface (Monolog by default)
  • PSR-7 - HTTP Message Interface (Guzzle by default)
  • PSR-11 - Container Interface (League Container by default)
  • PSR-15 - HTTP Middleware Interface
  • PSR-16 - Simple Cache Interface
  • PSR-17 - HTTP Factory Interface

πŸš€ Performance Features

  • Lazy Loading - Components loaded only when needed
  • Memory Management - Efficient memory usage and garbage collection
  • Connection Pooling - Optimized database connections
  • Smart Caching - Intelligent cache invalidation and management
  • Compiled Routes - Fast route matching and resolution

πŸ”’ Security Features

  • CSRF Protection - Built-in cross-site request forgery protection
  • SQL Injection Prevention - PDO prepared statements by default
  • XSS Protection - Automatic output escaping
  • File Upload Security - Secure file handling and validation
  • Input Validation - Comprehensive input sanitization
  • JWT Support - Built-in JWT token handling
  • Rate Limiting - Built-in request rate limiting

🌟 Community & Support

Getting Help

Contributing

We welcome contributions! Please see our Contributing Guide for details.

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests
  5. Submit a pull request

Code of Conduct

Please read our Code of Conduct to keep our community approachable and respectable.

πŸ“„ License

SPIN Framework is open-sourced software licensed under the MIT License.

πŸ™ Acknowledgments

  • Built with ❀️ by the SPIN Framework Team
  • Inspired by modern PHP frameworks and PSR standards
  • Special thanks to all contributors and the PHP community

πŸ“Š Statistics

  • Downloads: Total Downloads
  • Version: Latest Stable Version
  • Tests: Unit Tests

Ready to build something amazing? Start with SPIN Framework today and experience the joy of lightweight, fast PHP development! πŸš€