Phalcon has earned its reputation as one of the fastest PHP frameworks in the world, thanks to its innovative architecture that relies on a C-extension rather than pure PHP code. While its internal workings differ from other PHP frameworks, the structure of a Phalcon project remains intuitive, clean, and highly organized. This makes it an excellent choice for developers who value speed, scalability, and maintainable application architecture.
One of the strongest aspects of Phalcon is its well-designed project structure, which follows the Model-View-Controller (MVC) pattern. By default, a typical Phalcon project includes directories such as app/, public/, and config/, all working together to deliver an organized and scalable environment.
In this extended guide, we will explore the Phalcon project structure in depth, understand the purpose of each directory, examine how MVC components interact, and learn how this structure helps maintain code quality and performance. Whether you’re new to Phalcon or revisiting its architecture, this comprehensive breakdown will help you understand how everything fits together.
1. Introduction to Phalcon’s MVC Architecture
Before diving into the directory structure, it’s crucial to understand how Phalcon implements MVC.
MVC consists of:
- Models – Handle business logic, database interactions, and data representation.
- Views – Present data and render visual output.
- Controllers – Receive requests, coordinate logic, and return responses.
Phalcon implements MVC at a low level, meaning it optimizes routing, dispatching, and view rendering much more efficiently than traditional PHP frameworks. Despite this efficiency, its project structure remains approachable and easy to understand.
2. High-Level Overview of a Typical Phalcon Project
When creating a new Phalcon project using DevTools, you will see something like:
myproject/
│
├── app/
│ ├── controllers/
│ ├── models/
│ ├── views/
│ ├── bootstrap/
│ ├── library/
│ └── config/
│
├── public/
│ ├── index.php
│ └── assets/
│
├── cache/
└── vendor/
Although different templates of Phalcon generate slightly different structures, the core folders (app, public, config) remain consistent.
3. The app/ Directory — The Heart of a Phalcon Application
The app/ directory contains most of your core application logic. This is where MVC components live.
3.1 Controllers (app/controllers/)
Controllers manage the flow of your application. When a user accesses a route, the dispatcher triggers a specific controller and action.
A basic controller example:
class IndexController extends \Phalcon\Mvc\Controller
{
public function indexAction()
{
$this->view->message = "Welcome to Phalcon!";
}
}
Responsibilities:
- Handle incoming web requests
- Interact with models
- Pass data to views
- Redirect or return responses
Phalcon maps URLs to controllers efficiently through its router component, making applications very fast even when scaled.
3.2 Models (app/models/)
Models are responsible for:
- Database interactions
- Data validation
- Business logic
- ORM mapping
Phalcon includes its own high-performance ORM:
class Users extends \Phalcon\Mvc\Model
{
public $id;
public $name;
public $email;
}
The ORM automatically maps database columns to model properties.
Benefits of Phalcon Models:
- Lazy loading
- Relations and foreign keys
- Events and hooks
- Hydration modes
Models allow developers to build highly efficient database layers without excessive boilerplate.
3.3 Views (app/views/)
Views are responsible for rendering output to the browser.
Phalcon supports:
- Volt template engine (fastest)
- PHP-based views
- Custom templating
Example Volt view:
<h1>{{ message }}</h1>
Views are automatically rendered if their names match the controller/action path.
View layers include:
- Layouts
- Partials
- Templates
This system keeps a clean separation between logic and presentation.
4. The config/ Directory — Configuration and Services
Configuration plays a crucial role in Phalcon applications. Most services such as the database connection, router, session, and view engine are defined here.
Example config.php:
return [
'database' => [
'adapter' => 'Mysql',
'host' => 'localhost',
'username'=> 'root',
'password'=> '',
'dbname' => 'phalcon_db',
],
];
Common configuration elements:
- Database settings
- Application paths
- Service providers
- Environment variables
Phalcon encourages using the Dependency Injection (DI) container to register services cleanly.
5. The public/ Directory — Web-Accessible Folder
This is the only folder accessible from the browser in a properly configured application.
Contains:
index.php→ Main entry point- Assets (CSS, JS, images)
Example index.php bootstraps:
require_once '../app/bootstrap.php';
$application = new \Phalcon\Mvc\Application($di);
echo $application->handle($_SERVER['REQUEST_URI'])->getContent();
Key responsibilities of public/:
- Route all requests through index.php
- Store web assets
- Protect backend logic from exposure
Keeping all APIs, controllers, and models out of the public folder increases security significantly.
6. Bootstrap Files (app/bootstrap/)
The bootstrap directory sets up:
- Autoloading
- DI container
- Services
- Application configuration
Typical services.php:
$di->setShared('db', function() use ($config) {
return new \Phalcon\Db\Adapter\Pdo\Mysql([
'host' => $config->database->host,
'username' => $config->database->username,
'password' => $config->database->password,
'dbname' => $config->database->dbname,
]);
});
This helps centralize your application setup.
7. The library/ Directory — Custom Classes and Helpers
This directory stores:
- Utilities
- Custom components
- Helper functions
- Plugins
- Traits and base classes
Example helper:
class StringHelper
{
public static function clean($text)
{
return trim(strip_tags($text));
}
}
8. The cache/ Directory — Application Caching System
Phalcon supports several types of caching:
- Model metadata
- Volt template cache
- Output caching
- View caching
Caching improves your site speed dramatically.
Example cache definition:
$di->set('viewCache', function () {
$frontCache = new \Phalcon\Cache\Frontend\Output([
'lifetime' => 86400,
]);
return new \Phalcon\Cache\Backend\File($frontCache, [
'cacheDir' => '../cache/',
]);
});
9. The vendor/ Directory — Composer Dependencies
If you’re using Composer (highly recommended), external libraries are stored here.
Phalcon works seamlessly with Composer.
Typical uses:
- Authentication libraries
- Debugging tools
- Email libraries
- Payment APIs
10. How the Directories Work Together
Here’s what happens when a user visits your website:
- Request enters via
public/index.php - Router matches URL
- Controller is triggered
- Controller interacts with model
- Model accesses database
- Controller passes data to view
- View renders output
- Response is returned to browser
The Phalcon structure supports speed, readability, and a beautiful workflow.
11. Benefits of Phalcon’s Project Structure
11.1 Clean Separation of Concerns
Each directory has a specific purpose.
11.2 Scalable for Large Applications
Phalcon supports modules, microservices, and multi-layered architectures.
11.3 High Performance
Directory structure is optimized to reduce load time.
11.4 Easy Maintenance
Developers can quickly locate controllers, views, and models.
11.5 Secure by Design
Only the public/ directory is exposed to the web.
12. Optional Directories and Advanced Organization
Phalcon allows you to expand your structure with:
12.1 Modules
Useful for large apps:
app/modules/frontend/
app/modules/backend/
12.2 Services Directory
To store DI service definitions separately.
12.3 Middleware Directory
For application-level hooks.
12.4 Tasks Directory
For CLI commands using Phalcon\Cli.
13. Best Practices for Maintaining a Phalcon Project Structure
- Keep controllers lightweight
- Move logic to models or services
- Use Volt for clean templating
- Cache templates and metadata
- Avoid putting PHP code in public directory
- Use Composer for autoloading
- Separate configuration for environments
Leave a Reply