Skip to content

Introduction

Quiote is a PHP 8.5+ MVC framework descended from Agavi — itself a fork of Mojavi, one of the earliest PHP MVC frameworks. It targets large, long-lived applications where developers need fine-grained control over behaviour.

Mojavi was named after the Mojave desert. The agave plant grows in that desert, so the fork became Agavi. Quiote is the flower (the quiote) that the agave sends up at the end of its life — the framework that blooms from Agavi.

Agavi started life around 2006 and was maintained into the mid-2010s. It kept serving production systems for roughly a decade after active development stopped. In 2025 the largest remaining Agavi user began porting it to PHP 8. What started as a direct port became a substantial rewrite once it was clear how much had changed in PHP and in the wider ecosystem — PSR-7/PSR-15, DI containers, and modern language features did not exist when Agavi was designed.

AgaviQuiote
Global/action filter chainPSR-15 middleware pipeline
Bespoke request/responsePSR-7 (nyholm/psr7)
factories.xml instantiationDI container with constructor injection
Ad-hoc loggingPSR-3 structured logging
XML-only configPHP, YAML, or XML — mixed per file
Homegrown routingSymfony Routing component
PHP 5 codebasePHP 8.5+: enums, readonly, attributes

Quiote is not a rapid-prototyping framework. There is no “make a CRUD app in five minutes” story, and it will not scaffold an admin panel for you. What it gives you instead is a skeleton with explicit, auditable behaviour and a configuration system flexible enough to accommodate unusual requirements.

It fits best when:

  • The codebase is large and has many contributors.
  • The project is long-lived and you expect it to outlive the current team.
  • The integration surface is complex or unusual.
  • A team needs to retain very fine control over how requests are handled.

If you need to ship something quickly with opinionated defaults that make common decisions for you, Laravel and Symfony are better choices. If you are migrating from Agavi, or building something you expect to maintain for a decade, read on — and see Design philosophy for why Quiote is deliberately unopinionated.

That unopinionated stance is structural, not just cultural. The quioteframework/quiote kernel is a skeleton; the opinionated, heavier subsystems — rate limiting, the developer error page, an MCP server, OpenTelemetry, the Eloquent / Doctrine / Cycle / Propulsion ORM adapters, the PHPTAL / XSLT / Twig renderers, and PDO / cloud session backends — ship as separate quioteframework/* packages you install and enable only when you need them. (CSRF is the one that’s on by default — a security posture you consciously disable rather than opt into.) See Plugins overview.