mitsuki / controller
The core controller component for the Mitsuki framework, providing automated action resolution using Mitsuki Attributes and HTTP components.
Requires
- php: >=8.1
- mitsuki/attributes: ^1.0
- mitsuki/contracts: ^1.0
- mitsuki/http: ^1.0
Requires (Dev)
- pestphp/pest: ^4.4
README
Core controller layer for the Mitsuki Framework.
This package provides the base controller abstraction and the automatic controller discovery system used by the Mitsuki Router. It integrates seamlessly with the mitsuki/attributes package to build your routing table from PHP 8 Attributes.
โจ Features
- Automatic Controller Discovery: Recursively scans your project to find valid controllers.
- Attribute-Driven: Fully compatible with
#[Controller]and#[Route]attributes. - Zero Configuration: No manual controller registration required.
- Lightweight & Framework-Oriented: Designed specifically for the Mitsuki ecosystem.
- Tested & Reliable: Includes automated tests for discovery edge cases.
๐ Installation
Install via Composer:
composer require mitsuki/controller
Requires
mitsuki/attributesfor controller and route metadata.
๐ Usage
1๏ธโฃ BaseController
The BaseController provides convenient helper methods to create HTTP responses.
use Mitsuki\Controller\BaseController; class UserController extends BaseController { public function index() { return $this->response('<h1>Hello World</h1>'); } public function api() { return $this->json(['status' => 'ok']); } }
Available Helpers
response($body, int $status = 200, array $headers = []): Response
Creates a standard HTTP response.
- Default
Content-Type:text/html - Fully customizable headers
json($data, int $status = 200, array $headers = []): JsonResponse
Creates a JSON response.
- Automatically encodes data to JSON
- Automatically sets
Content-Type: application/json
2๏ธโฃ ControllerResolver
The ControllerResolver is responsible for automatically discovering controllers inside your project.
use Mitsuki\Controller\Resolvers\ControllerResolver; $resolver = new ControllerResolver(__DIR__ . '/src'); $controllers = $resolver->resolve();
๐ How Controller Discovery Works
A class is considered a controller if:
- It is decorated with
#[Controller] - OR it contains at least one method decorated with
#[Route]
The resolver:
-
Recursively scans the provided root directory.
-
Ignores:
- Non-PHP files
- Directories
- The
vendor/directory
-
Extracts the Fully Qualified Class Name (FQCN).
-
Uses PHP
ReflectionClassto inspect attributes. -
Returns a unique list of valid controllers.
๐ Architecture
Project Source Directory
โ
ControllerResolver
โ
ReflectionClass
โ
#[Controller] / #[Route]
โ
Mitsuki Router builds routing table
This keeps your routing system:
- Decoupled
- Clean
- Fully metadata-driven
๐งช Testing
The package includes automated tests that verify:
- โ
Detection of classes with
#[Controller] - โ
Detection of classes with
#[Route]methods - โ Ignoring classes without Mitsuki attributes
- โ
Ignoring the
vendor/directory - โ Handling invalid directories safely
Example test scenario:
#[Controller('/admin')] class AdminController {}
class BlogController { #[Route('blog_index', '/blog', ['GET'])] public function index() {} }
๐ฆ Package Structure
src/
โโโ BaseController.php
โโโ Resolvers/
โโโ ControllerResolver.php
๐ค Contributing
To contribute:
- Fork the repository.
- Improve or extend the resolver logic.
- Add or update tests.
- Submit a Pull Request.
๐ License
This project is licensed under the MIT License.
Maintained by Zgenius Matondo GitHub: https://github.com/zgeniuscoders