netzmacht / php-javascript-builder
PHP Javascript builder 库
Requires
- php: ^7.1 || ^8.0
- ext-ctype: *
- ext-json: *
- symfony/event-dispatcher-contracts: ^1.1 || ^2.0
Requires (Dev)
- phpcq/coding-standard: ^2.1
- phpcq/runner-bootstrap: ^1.0@dev
- phpspec/phpspec: ^6.0 || ^7.0
Suggests
- symfony/event-dispatcher: Install the symfony event dispatcher to use the event dispatching encoder.
This package is auto-updated.
Last update: 2024-09-22 14:25:00 UTC
README
这个库是一个基于事件的 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
之前被调用。