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.

explanation

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'));
    }
}