Skip to content

openclerk/routing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

openclerk/routing Build Status

A library for simple routing in PHP.

Using

This project uses openclerk/config for config management.

First configure the component with site-specific values:

Openclerk\Config::merge(array(
  "absolute_url" => "http://localhost/path/",
));

Add a simple router file:

<?php
// router.php

require(__DIR__ . "/../inc/global.php");
$path = require_get("path", "security/login/password");

try {
  \Openclerk\Router::process($path);
} catch (\Openclerk\RouterException $e) {
  header("HTTP/1.0 404 Not Found");
  echo htmlspecialchars($e->getMessage());
}
?>

Add a .htaccess that translates paths to this router:

RewriteEngine on

# Forbid access to any child PHP scripts
RewriteRule ^([^\.]+)/([^\.]+).php$   -                   [F]

RewriteRule ^([^\.]+)$                router.php?path=$1  [L,QSA]

Define site routes:

// set up routes
\Openclerk\Router::addRoutes(array(
  "security/login/password" => "security/login.php?type=password",
  "security/login/:key" => "security/login-:key.php?type=:key",
  // by default any unmatched routes will require <module>.php
));

Now you can use url_for() and absolute_url_for():

<a href="<?php echo htmlspecialchars(url_for('security/login/password')); ?>">Login with password</a>

Renderable objects

You can also pass along an object with a render($args) method, which will be called instead:

class MyApi {
  function render($args) {
    // $args = array('code' => ...)
  }
}

\Openclerk\Router::addRoutes(array(
  "api/currency/:code" => new MyApi(),
));

Tests

composer update --dev
vendor/bin/phpunit

TODO

  1. Actual documentation
  2. Tests
  3. Publish on Packagist