netzmacht/php-javascript-builder

PHP Javascript builder 库

1.0.3 2022-02-22 08:42 UTC

This package is auto-updated.

Last update: 2024-09-22 14:25:00 UTC


README

Build Status Version License Code quality Downloads

这个库是一个基于事件的 PHP 5.4 JavaScript builder/compiler。

这个库的目标是将 PHP 中创建的对象定义树转换为 JavaScript。这对于你有一些动态定义的 JavaScript 库非常有用。

安装

这个库可以使用 composer 安装。

$ php composer.phar require netzmacht/php-javascript-builder:~1.0

使用方法

实现 JavaScript 编码功能的简单方法是实现 ConvertsToJavascript 接口。然后编码器使用提供的 encode 方法来编码对象。

请看下面的示例

<?php

require_once dirname(__DIR__) . '/vendor/autoload.php';

class Foo implements ConvertsToJavascript
{
    private $bar;

    public function __construct($bar)
    {
        $this->bar = $bar;
    }

    public function encode(Encoder $encoder, $flags = null)
    {
        return 'console.log(' . $encoder->encodeReference($this->bar) . ')' . $encoder->close($flags);
    }
}

class Bar implements ConvertsToJavascript, ReferencedByIdentifier
{
    public function encode(Encoder $encoder, $flags = null)
    {
        return sprintf (
            '%s = new Bar()%s',
            $encoder->encodeReference($this),
            $encoder->close($flags)
        );
    }

    public function getReferenceIdentifier()
    {
        return 'bar';
    }
}

$builder = new Builder();

$bar = new Bar();
$foo = new Foo($bar);

echo '<pre>';
echo $builder->encode($foo);
// bar = new Bar();
// console.log(bar);

自定义编码器

你还可以通过向编码链中添加另一个编码器来调整编码过程。这个库提供了一个使用 symfony/event-dispatcher 实现的事件派发编码器。请注意,事件派发器不是默认安装的。如果你想使用它,请安装它

$ php composer.phar require symfony/event-dispatcher:~2.3

构建器接受一个编码器工厂可调用函数。因此,你可以轻松地分配其他编码器。请注意,ResultCacheEncoder 是必需的,这样在引用之前,引用项就会被渲染。否则,你将只会看到上面的示例的 bar.foo(); 输出。

// Setup the dispatcher outside so that the listeners can be added.
$dispatcher = new EventDispatcher();
$factory    = function(Output $output) use ($dispatcher) {
    $encoder = new ChainEncoder();
    
    $encoder
        ->register(new ResultCacheEncoder())
        ->register(new \EventDispatchingEncoder())
        ->register(new JavascriptEncoder($output));
    
    return $encoder;
};

事件派发编码器触发两个事件

  • javascript-builder.encode-reference 事件,事件对象为 Netzmacht\JavascriptBuilder\Symfony\Event\EncodeReferenceEvent,在请求引用时触发。它在检查 ReferencedByIdentifier 之前被调用。

  • javascript-builder.encode-value 事件,事件对象为 Netzmacht\JavascriptBuilder\Symfony\Event\EncodeReferenceEvent,在创建对象值时触发。它在默认实现检查 ConvertsToJavascript 接口或 JsonSerialize 之前被调用。