Codegen (eg URI Map generation) on top of hhvm/hack-router
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src
tests
.gitattributes
.gitignore
.hhconfig
.travis.sh
.travis.yml
CONTRIBUTING.md
LICENSE
README.md
composer.json
composer.lock
hh_autoload.json
hhast-lint.json

README.md

Hack-Router-Codegen Build Status

Code generation for controller classes using the UriPattern system from hhvm/hack-router

This currently supports generating:

  • Request routing maps
  • Hack request routing classes for your site

For now, looking at the unit tests is the best way to learn how to use it.

Building a Request Router

<?hh
require_once(__DIR__.'/../vendor/hh_autoload.php');

use \Facebook\HackRouter\Codegen;

final class UpdateCodegen {
  public function main(): void {
    Codegen::forTree(
      __DIR__.'/../src/',
      shape(
        'controllerBase' => WebController::class,
        'router' => shape(
          'abstract' => false,
          'file' => __DIR__.'/../codegen/Router.php',
          'class' => 'Router',
        ),
      ),
    )->build;
  }
);

This will generate a class called 'Router', complete with an automatically-generated route map, based on the URI patterns in your controllers.

WebController is the root controller for your site, and must implement Facebook\HackRouter\IncludeInUriMap, which in turn requires Facebook\HackRouter\HasUriPattern - for example:

public static function getUriPattern(): UriPattern {
  return (new UriPattern())
    ->literal('/')
    ->string('MyString')
    ->literal('/')
    ->int('MyInt')
    ->literal('/')
    ->enum(MyEnum::class, 'MyEnum');
}

Commit Your Codegen!

This is unusual advice, but it's the best approach for Hack code as you otherwise have a circular dependency:

  • HHVM will not execute hack code if there are references to undefined classes
  • Once you use the codegen, you reference the codegen classes
  • ... so you can't build them if you don't already have them

Contributing

We welcome GitHub issues and pull requests - please see CONTRIBUTING.md for details.

License

hack-router-codegen is MIT-licensed.