InforRoutes

A simple and dependency free routing system providing:

  • Non blocking dispatch of system WEB and CLI functionalities
  • Parameters detection on the URL segments
  • Route grouping based on namespaces
  • Error handling and 404 detection
  • Attachable and global middlewares

Usage

Installation

First install the package with composer require inforsistemas/routes. You might need to add a custom repository on the composer.json

"repositories": [{
    "type": "composer",
    "url": "https://satis.domain.com"
}],

Server configuration

Requirements

The following packages need to be installed for the project to run

  • Apache
    • apache2 phpX.X phpX.X-fpm libapache2-mod-phpX.X
  • Nginx
    • nginx phpX.X phpX.X-fpm

The ports 80 and 443 must be open: ufw allow 80 && ufw allow 443

Apache

For apache, the basic required configuration

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/public
    ServerName example.com
     
    <Directory /var/www >
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
     
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

For a server with HTTPs, the configuration with redirection

<VirtualHost *:80> 
    ServerName example.com
    Redirect / https://example.com
 </VirtualHost>
 
<IfModule mod_ssl.c>
    <VirtualHost *:443>
     
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/public
        ServerName urfat.com.br
     
     
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
     
        SSLCertificateFile /etc/letsencrypt/live/example.com.br/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/example.com.br/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
</IfModule>

Nginx

For Nginx,this is the basic required configuration with PHP-FPM

server {
    listen 82 default_server;
    listen [::]:82 default_server;

    server_name example.com;

    root /var/www/html/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name localhost;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        #Check fpm-version
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

For a server with HTTPs, the configuration with redirection

server {
    listen   80;
    listen   [::]:80;
    listen   443 default_server ssl;

    server_name example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key    /path/to/my/key;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS:!AES256";
    ssl_prefer_server_ciphers on;
    ssl_dhparam /path/to/my/dhp-4096.pem #sudo openssl dhparam -out /path/to/my/dhp-4096.pem 4096

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }
}

Hello World

With the dependencies and the server with the correct configuration, create a index.php with the content

<?php

include_once 'vendor/autoload.php';
use Routes\RouteCollection as RouteCollection;

RouteCollection::get ("/", function(){
    echo "Hello World";
});

RouteCollection::getInstance()->submit();

Inner workings

The package consist in 3 main files, with RouteCollection.php providing the main API

  • Route.php => Stores each route information
  • RouteCollection.php => Aggregate all routes and provide a interface to interact with the routes dataset
  • RouteGroup.php => Aggregate a group of routes based on their namespaces

The class RouteCollection is treated as a Singleton that return it's own global instance when loaded. The main interface would be something like: RouteCollection::add($verb, $uri, $callback, $weight = 0), this method will return the instance of the Route object, so that the Route properties can be configured

Route settings:

  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->doBlock()
    • After this route execute, no more routes would be executed
  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->notBlock()
    • The execution of this route will not block the execution of the next routes
  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->doIgnore()
    • This route will not count as a executed route, so a 404 can be detected
  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->middlewareIgnore($name = '')
    • This route will not execute a registered global middleware
  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->middlewareAdd($name = '', $params = [])
    • Register that this route must pass by a registered middleware
  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->middlewareAppend($name = '', $function)
    • Append a ad-hock middleware to this specific route
  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->setWeight($weigth = 0)
    • Define the priority of this route on the execution chain
  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->setName($name)
    • Add a property name for the route object
  • RouteCollection::add($verb, $uri, $callback, $weight = 0)->setTag($key = '', $value = '')
    • Add a custom arbitrary tag on the route object

Other resources

https://stackoverflow.com/questions/8054165/using-put-method-in-html-form

S
Description
A simple PHP routing library
Readme
96 KiB
Languages
PHP 99.9%
Shell 0.1%