Skip to main content

Advanced Patterns

Subsite Installation

When deployed to a subdirectory:

use PhpCompatible\Router\Router;

Router::setRoot('/myapp');

Router::run(function() {
Router::get('/', function() {
// Matches /myapp/
return 'Home';
});

Router::get('/users', function() {
// Matches /myapp/users
return array('users' => array());
});
});

// Build URLs with the root prefix
$url = Router::rootUrl('/users'); // Returns: /myapp/users

Conditional Routes

Router::run(function() {
// Only register debug routes in development
if (getenv('APP_ENV') === 'development') {
Router::get('/debug', function() {
return $_SERVER;
});

Router::get('/debug/routes', function() {
return array('routes' => get_registered_routes());
});
}

// Feature flag
if (feature_enabled('new_api')) {
Router::group('/api/v2', function() {
Router::get('/users', NewUsersController::class);
});
}
});

Organizing Large Applications

Directory Structure

/app
├── public/
│ └── index.php # Entry point
├── routes/
│ ├── web.php # Web routes
│ ├── api.php # API routes
│ └── admin.php # Admin routes
├── controllers/
│ ├── Web/
│ │ └── HomeController.php
│ ├── Api/
│ │ └── UserController.php
│ └── Admin/
│ └── DashboardController.php
└── vendor/

Entry Point

<?php
// public/index.php
require_once __DIR__ . '/../vendor/autoload.php';

use PhpCompatible\Router\Router;

Router::run(function() {
require __DIR__ . '/../routes/web.php';
require __DIR__ . '/../routes/api.php';
require __DIR__ . '/../routes/admin.php';
});

Route Files

routes/web.php:

<?php
use PhpCompatible\Router\Router;

Router::get('/', 'Web\HomeController');
Router::get('/about', 'Web\AboutController');
Router::get('/contact', 'Web\ContactController');
Router::post('/contact', 'Web\ContactController');

routes/api.php:

<?php
use PhpCompatible\Router\Router;

Router::group('/api', function() {
Router::get('/users', 'Api\UserController::index');
Router::post('/users', 'Api\UserController::store');
Router::get('/users/:id', 'Api\UserController::show');
Router::put('/users/:id', 'Api\UserController::update');
Router::delete('/users/:id', 'Api\UserController::destroy');
});

routes/admin.php:

<?php
use PhpCompatible\Router\Router;

Router::group('/admin', function() {
// Admin auth check
$token = request_header('Authorization');
if (!is_admin($token)) {
throw HttpException::forbidden('Admin access required');
}

Router::get('/dashboard', 'Admin\DashboardController');
Router::get('/users', 'Admin\UsersController');
});

Static Helper Methods

use PhpCompatible\Router\Router;

// Run the router
Router::run($routes);

// Set root URL for subsites
Router::setRoot('/subsite');

// Get URL with root prefix
$url = Router::rootUrl('/path');

// Redirect
Router::redirect('/new-location');

Complete Example

<?php
require_once 'vendor/autoload.php';

use PhpCompatible\Router\Router;
use PhpCompatible\Router\JsonResponse;
use PhpCompatible\Router\HttpException;

Router::run(function() {
// API routes
Router::group('/api', function() {
Router::get('/users', function() {
return array('users' => get_all_users());
});

Router::get('/users/:id', function($request) {
$id = $request->getParam('id');
$user = find_user($id);

if (!$user) {
throw HttpException::notFound('User not found');
}

return array('user' => $user);
});

Router::post('/users', function() {
$data = json_body();

if (empty($data['email'])) {
return JsonResponse::response(HTTP_BAD_REQUEST, array('error' => 'Email required'));
}

$user = create_user($data);
return JsonResponse::response(HTTP_CREATED, array('user' => $user));
});

Router::delete('/users/:id', function() {
delete_user($_GET[':id']);
return JsonResponse::response(HTTP_NO_CONTENT);
});
});

// Web routes
Router::get('/', function() {
return '<h1>Welcome</h1>';
});
});