rares / big-pipe-bundle
在 Symfony 中实现基本 BigPipe 概念的 Bundle。
Requires
- php: ^7.1.3
- symfony/config: ^4.1
- symfony/dependency-injection: ^4.1
- symfony/event-dispatcher: ^4.1
- symfony/framework-bundle: ^4.1
- symfony/http-foundation: ^4.1
- symfony/http-kernel: ^4.1
- symfony/security-core: ^4.1
- symfony/templating: ^4.1
- twig/twig: ^1.35|^2.0
README
BigPipeBundle 是一个用于 Symfony 3.4/4 的 Bundle,它将基本 BigPipe 概念集成到 Symfony 应用程序中。有关该概念的更多信息,可以在 这里 找到。
安装
要安装此 Bundle,首先您需要安装 jQuery。
然后需要引入此 Bundle
composer require "rares/big-pipe-bundle"
然后在您的 AppKernel 文件中启用此 Bundle
$bundles = [
...,
new Rares\BigPipeBundle\RaresBigPipeBundle(),
];
然后您需要使用以下命令安装资产
bin/console assets:install --symlink
然后您需要将此 Bundle 的脚本包含到您的模板中
<script src="{{ asset('bundles/raresbigpipe/js/scripts.js') }}"></script>
使用
要使用此 Bundle,只需在模板中调用 render_bigpipe Twig 函数,在您通常使用其他 Twig 渲染函数的地方。此函数将渲染一个页面片段的占位符标签,然后在主页面加载完毕后,按顺序加载页面上的所有页面片段。此函数支持路径和控制器引用,就像正常的渲染函数一样。
此函数还接受一个可选的第二个参数,即页面片段的优先级。优先级较高的页面片段将首先在页面上渲染。
示例
{{ render_bigpipe('url...') }}<br>
{{ render_bigpipe(path('route...')) }}<br>
{{ render_bigpipe(controller('Controller::...'), 3) }}
然后,在您的控制器中,您必须使用 BigPipeRenderer 类中的 renderBigPipe 方法
return $this->get(BigPipeRenderer::class)->renderBigPipe('page.html.twig', [
...
]);
就是这样!您现在有一个使用此 Bundle 的应用程序!您的首页将首先渲染,然后按页面定义的顺序渲染所有页面片段。
缓存
此 Bundle 还与 Symfony 反向代理集成以进行缓存。实际上,建议在您的应用程序中启用缓存。要启用缓存,只需简单地编辑您的 web/app.php 文件,并使用此 Bundle 提供的 BigPipeHttpCache 类代替默认的 Symfony AppCache kernel
$kernel = new \Rares\BigPipeBundle\Cache\BigPipeHttpCache($kernel);
您还可以将自定义 StoreInterface 作为第二个参数传递给 BigPipeHttpCache 类。如果您想将此 Bundle 与 ReverseProxyBundle 一起使用,这将很有用。
会话
默认情况下,Symfony 中的会话在内核响应事件中保存,这对于正常应用程序来说效果很好,但不与 BigPipe Bundle 兼容,因为响应是流式传输的,并且首先发送了头部,这将阻止在页面片段中访问会话。由于这个原因,此 Bundle 重写了此行为,并且将会话在内核终止事件之后保存。如果您有会话问题,您可以手动保存它,但请注意,这将阻止它被加载在该特定子请求之后的所有页面片段使用。
查看 demo 分支,以查看使用此 Bundle 的示例项目。