{"id":16858035,"url":"https://github.com/leeoniya/route66.php","last_synced_at":"2025-03-22T06:31:14.365Z","repository":{"id":25099618,"uuid":"28520742","full_name":"leeoniya/Route66.php","owner":"leeoniya","description":"PHP micro-router","archived":false,"fork":false,"pushed_at":"2022-01-27T17:27:50.000Z","size":13,"stargazers_count":15,"open_issues_count":3,"forks_count":2,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-05-02T00:52:37.042Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leeoniya.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-12-26T20:44:12.000Z","updated_at":"2023-06-23T10:14:49.000Z","dependencies_parsed_at":"2022-08-21T14:50:33.260Z","dependency_job_id":null,"html_url":"https://github.com/leeoniya/Route66.php","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leeoniya%2FRoute66.php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leeoniya%2FRoute66.php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leeoniya%2FRoute66.php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leeoniya%2FRoute66.php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leeoniya","download_url":"https://codeload.github.com/leeoniya/Route66.php/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244918500,"owners_count":20531682,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T14:11:17.290Z","updated_at":"2025-03-22T06:31:12.804Z","avatar_url":"https://github.com/leeoniya.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Route66.php\n-----------\nPHP micro-router _(MIT Licensed)_\n\n- Concise, simple syntax wrapping a full feature set\n- Easy install; Composer or single file include (~200 SLOC)\n- Low routing overhead (\u003c 1ms)*\n\nRoute66 was written to add [some features](#added-feats) to the minimalist [Macaw](https://github.com/NoahBuscher/Macaw) router without bloating it.\n\n#### Nginx config example\n\n```nginx\nserver {\n\tindex index.html index.htm index.php;\n\n\tlocation / {\n\t\ttry_files $uri $uri/ /index.php?/$uri;\n\t}\n\n\tlocation ~ \\.php$ {\n\t\tfastcgi_pass 127.0.0.1:9000;\n\t\tfastcgi_index index.php;\n\t\tfastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n\t\tinclude fastcgi_params;\n\t}\n}\n```\n\n#### Install (require or Composer)\n\n```php\nrequire 'Route66.php';\n```\n\nhttps://packagist.org/packages/leeoniya/route66\n\n```json\n{\n\t\"require\": {\n\t\t\"leeoniya/route66\": \"dev-master\"\n\t}\n}\n```\n\n#### Basic example\n\n```php\n// front controller (index.php)\nrequire 'Route66.php';\n\nuse Route66 as R;\n\nR::get('/', function() {\n\techo 'Hello world!';\n});\n\nR::dispatch();\n```\n\n#### HTTP methods\n\n```php\n// any HTTP method can be bound via static invocation using its name\nR::post('/topics', function() {});\n\n// multiple methods\nR::match('post|put', '/comment', function() {});\n\n// equivalent to R::match('get|post|put|patch|delete|head|options',..)\nR::any('/', function() {};)\n```\n\n#### Named params \u0026 validation\n\n```php\n// basic param (all characters except '/')\nR::get('/posts/@id',       function($id) {});\n\n// param validated by regex alias\nR::get('/posts/@id:alpha', function($id) {});\n\n// aliases and regexs can be broken out for readability\nR::get('/posts/@id',       function($id) {}, ['id' =\u003e ':alpha']);\nR::get('/posts/@id',       function($id) {}, ['id' =\u003e '\\w{12}']);\n\n// define a custom alias\nR::alias(':date', '[0-9]{4}-[0-9]{2}-[0-9]{2}');\n```\n\n#### Optional segments \u0026 params\n\n```php\n// optional params with defaults (set in handler)\nR::get('/posts(/@year(/@month(/@day)))', function($year = 2015, $month = 6, $day = 15) {});\n\n// regex alias without a param (non-capturing)\nR::get('/posts(/:slug)', function() {});\n\n// optional trailing slash (though rtrim-ing it from REQUEST_URI before dispatch is faster)\nR::get('/blog/?', function() {});\n```\n\n#### Un-named params\n```php\n// un-named params via regex capture groups\nR::get('/posts/(\\w{12})', function($id) {});\n```\n\n#### Route prefixing (base path)\n\n```php\nR::base('/blog');\nR::get('/posts', function() {});\t// maps to /blog/posts\n\nR::base('/admin');\nR::get('/login', function() {});\t// maps to /admin/login\n```\n\n#### Before pre-filter (fall-through)\n\n```php\n// before all /admin* routes\nR::get('/admin(/:all)', function() {\n\t// verify valid session, etc...\n\treturn R::NOHALT;\t\t// fall through to additional routes\n});\n\nR::get('/admin/dashboard', function() {\n\t// show dashboard...\n});\n```\n\n#### Custom catch-all (no route found)\n\n```php\nR::nomatch(function($meth, $uri) {\n\theader($_SERVER[\"SERVER_PROTOCOL\"] . \" 404 Not Found\");\n\texit('404 Not Found.');\n});\n```\n\n#### Custom dispatch (e.g. internal redirects)\n\n```php\nR::dispatch('get', '/blog');\n```\n\n#### Route caching\n\n```php\n// example of storing compiled routes in session\nsession_start();\n\nif ($routes = @$_SESSION['routes'])\n\tR::import($routes);\n\n// define all routes here\n\nR::dispatch();\n\nif (!isset($_SESSION['routes']))\n\t$_SESSION['routes'] = R::export();\n```\n\n#### Named routes \u0026 reverse routing\n\n```php\n// un-named\nR::get('/users/@id', function($id) {}, ['id'=\u003e':alpha']);\n\n// named (the trailing 2 args can be passed in any order. all below are equivalent.)\nR::get('/users/@id', function($id) {}, 'named1');\nR::get('/users/@id', function($id) {}, ['id'=\u003e':alpha'], 'named1');\nR::get('/users/@id', function($id) {}, 'named1', ['id'=\u003e':alpha']);\n\n// dispatch a named route\nR::dispatch('get', 'named1', ['id' =\u003e 'abc123']);\n```\n\n#### Util methods\n\n```php\nR::is_ajax();\nR::is_https();\nR::redirect($location, $code = 301);\n```\n\n#### New features (relative to Macaw) \u003ca id=\"added-feats\"\u003e\u003c/a\u003e\n\n- Named params (e.g. `@user:alpha`)\n- Optional route segments and params, param defaults\n- Route-group prefixing\n- Param regex \u0026 aliases can be broken out for readability\n- Short defs for multi-method routes\n- Named routes and reverse routing, custom dispatch\n- Per-route fall-through control (Macaw has only global)\n- Route compilation cache, import/export\n- Utility methods for `is_ajax`, `is_https` and `redirect`\n- Modified and added regex aliases\n\n#### Other PHP routers\n\n- Macaw - https://github.com/NoahBuscher/Macaw\n- Phroute - https://github.com/mrjgreen/phroute\n- Klein - https://github.com/chriso/klein.php\n- FastRoute - https://github.com/nikic/FastRoute\n- Pux - https://github.com/c9s/Pux\n- AltoRouter - https://github.com/dannyvankooten/AltoRouter\n- Aura - https://github.com/auraphp/Aura.Router\n- mu - https://github.com/lastguest/mu\n\n\\* As with any router, speed will depend on: route quantity \u0026 complexity, numbers of params, whether caching is used, server hardware, PHP version, opcode caching.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleeoniya%2Froute66.php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleeoniya%2Froute66.php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleeoniya%2Froute66.php/lists"}