Skip to content

xp-forge/frontend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

0ba51b2 · Apr 3, 2018

History

30 Commits
Apr 2, 2018
Apr 2, 2018
Apr 3, 2018
Apr 3, 2018
Apr 2, 2018
Apr 2, 2018

Repository files navigation

Web frontends

Build Status on TravisCI XP Framework Module BSD Licence Required PHP 5.6+ Supports PHP 7.0+ Supports HHVM 3.4+ Latest Stable Version

Frontends based on xp-forge/web.

Example

Frontend uses classes with methods annotated with HTTP verbs to handle routing. These methods return a context, which is passed along with the template name to the template engine.

class Home {

  #[@get, @$param: param('name')]
  public function get($param) {
    return ['name' => $param ?: 'World'];
  }
}

For the above class, the template engine will receive home as template name and the returned map as context. The implementation below uses the xp-forge/handlebars library to transform the templates.

use com\handlebarsjs\{HandlebarsEngine, FilesIn};
use io\Path;
use web\frontend\Templates;

class TemplateEngine implements Templates {
  private $backing;

  public function __construct(Path $templates) {
    $this->backing= (new HandlebarsEngine())->withTemplates(new FilesIn($templates));
  }

  public function write($name, $context, $out) {
    $this->backing->write($this->backing->load($name), $context, $out);
  }
}

The handlebars template is quite straight-forward:

<html>
  <head>
    <title>Hello {{name}}</title>
  </head>
  <body>
    <h1>Hello {{name}}</h1>
  </body>
</html>

Finally, wiring it together is done in the application class, as follows:

use web\Application;
use web\frontend\{Frontend, Templates};
use web\handler\FilesFrom;
use io\Path;

class Site extends Application {

  /** @return [:var] */
  protected function routes() {
    $files= new FilesFrom(new Path($this->environment->webroot(), 'src/main/webapp'));
    $templates= new TemplateEngine(new Path($this->environment->webroot(), 'src/main/handlebars'));

    return [
      '/favicon.ico' => $files,
      '/static'      => $files,
      '/'            => new Frontend(new Home(), $templates)
    ];
  }
}

To run it, use xp -supervise web Site, which will serve the site at http://localhost:8080/. Find and clone the example code here.