XHP Template Engine pada Laravel 4

XHP Template Engine pada Laravel 4

Limitations

Semenjak rilis HHVM dan XHP yang baru, agar bisa memakai fitur XHP componentdengan cara composition, pada file view harus diawali dengan open tag hhvm

Pada Blade compiler hal tersebut tidak dimungkinkan sebab secara default tidakada open tag hhvm di awal file. Selain itu setiap syntax blade seperti@include, @section, @if, @foreach, dst., akan diubah dan mengandung tag.

Sementara itu proses migrasi View template akan dilakukan secara perlahan denganmasih menggunakan fitur pada Blade compiler.

Examples

File source: index.blade.php.

[code lang=text]@extends(‘layout’)

@section(‘main’) @include(‘header’)

Hello My Pren {$name}@stop[/code]

File compiled (actual result): storage/.../index.php

[code lang=text]startSection(‘main’, …); ?> make(‘header’, …)->render(); ?>

Hello My Pren stopSection(‘main’, …); ?>

make(‘layout’)->render(); ?>[/code]

File template Blade adalah file HTML yang disisipi tag PHP.Sedangkan pada XHP, file template adalah file script PHP dimanaecho berfungsi untuk menghasilkan HTML.

Expected result dari template Blade di atas seharusnya:

[code lang=text]startSection(‘main’, …); echo $__env->make(‘header’, …)->render(); echo

Hello My Pren {$name};$__env->stopSection();

echo $__env->make(‘layout’)->render();[/code]

Dengan membandingkan actual result dan expected result, makakonversi dari Blade menjadi XHP pada XhpBladeCompiler(extends dari Illuminate\View\Compilers\BladeCompiler)dengan snippet sebagai berikut:

1. Tambah tag

[code lang=text]public function compile(…) { … $this>files->put(…, “

2. Buang tag  pada syntax @extends, @section,@stop, dan @include.

[code lang=text]protected function compileExtends(…) {…}protected function compileSection(…) {…}protected function compileStop(…) {…}protected function compileInclude(…) {…}[/code]

3. Ubah syntax pada tempate dari Blade menjadi XHP-Blade:File source: index.xhp.php.

[code lang=text]@extends(‘layout’)

@section(‘main’) @include(‘header’) echo

Hello My Pren {$name};@stop[/code]

4. Register XhpBladeCompiler untuk file ber-ekstensi 'xhp.php'.

[code lang=text]use Illuminate\View\Engines\CompilerEngine;use Illuminate\Support\ServiceProvider;

// @see: Illuminate\View\ViewServiceProviderclass XhpServiceProvider extends ServiceProvider {

public function register() { $resolver = $this->app[‘view.engine.resolver’];

$this->app->bindShared(‘xhp.compiler’, function($app) { $cache = $app[‘path.storage’].’/views’; return new XhpBladeCompiler($app[‘files’], $cache); });

$resolver->register(‘xhp.engine’, function() use($app) { return new CompilerEngine($app[‘xhp.compiler’], $app[‘files’]); });

View::addExtension(‘xhp.php’, ‘xhp.engine’); }}[/code]