Canvas Framework
Canvas brings modern PHP architecture to applications you already have. Drop it into an existing codebase, keep legacy URLs working, and migrate to annotation routing, contextual DI, and ObjectQuel ORM one step at a time — no big-bang rewrite required.
Six integrated features that simplify PHP development
🔄 Legacy Integration
Add Canvas to existing applications incrementally. Legacy URLs remain functional while you adopt Canvas services gradually.
⚡ AOP
Cross-cutting concerns — authentication, caching, rate limiting — declared directly on the methods that need them. No centralized pipeline to trace through.
📦 Contextual Containers
Code against interfaces. Canvas resolves implementations based on request context.
🗄️ ObjectQuel ORM
Query language designed for PHP syntax patterns. Write queries that read like native code.
🎯 Annotation Routes
Route definitions live in controller methods using @Route annotations. No separate routing files.
🚀 Auto-Discovery
Controllers, services, and packages are discovered through Composer metadata. No configuration files required.
Example Controller
Basic Canvas controller structure:
<?php
namespace App\Controllers;
use Quellabs\Canvas\Annotations\Route;
use Quellabs\Canvas\Annotations\InterceptWith;
use Quellabs\Canvas\Controllers\BaseController;
use App\Entities\UserEntity;
/**
* @InterceptWith(RequireAuthAspect::class)
*/
class UserController extends BaseController {
/**
* @Route("/users")
* @InterceptWith(CacheAspect::class, ttl=300)
*/
public function index() {
$users = $this->em()->findBy(UserEntity::class, ['active' => true]);
return $this->render('users/index.tpl', compact('users'));
}
}