在kernel.request事件之后添加Twig全局变量



我目前正在SAAS中开发一个项目,每个客户都可以通过个性化的URL(site1.com,site2.com 等)访问他的平台。 对于每个域名,在后台定义了一组模板自定义数据,我必须能够从我的 Twig 文件访问它。因此,我在kernerl.request事件上定义了一个侦听器,该侦听器根据当前域名向 Twig 添加一个全局变量。在大多数情况下一切正常,除了首次显示页面时,Twig 必须在上游运行,我收到以下错误:

无法添加全局"站点",因为运行时或扩展具有 已初始化。

侦听器类

class SiteListener
{
public function __construct(
SiteHelper $siteHelper,
Twig_Environment $twig
) {
$this->siteHelper = $siteHelper;
$this->twig       = $twig;
}
/**
* Add current contexts to twig global.
*/
public function addContextsToTwigGlobal(GetResponseEvent $event)
{
$this->twig->addGlobal('site', $this->siteHelper);
}
}

侦听器服务声明

multisite.listener.site:
class: MultisiteBundleListenerSiteListener
arguments:
- "@multisite.helper.site"
- "@twig"
tags:
- { name: kernel.event_listener, event: kernel.request, method: addContextsToTwigGlobal }

站点助手服务

class SiteHelper
{
/**
* @var RequestStack
*/
protected $requestStack;
/**
* @var ContextConfigManager;
*/
protected $contextConfigManager;
/**
* @var ContextConfig
*/
protected $contextConfig;
public function __construct(
RequestStack $requestStack,
ContextConfigManager $contextConfigManager
) {
$this->requestStack         = $requestStack;
$this->contextConfigManager = $contextConfigManager;
$this->contextConfig = $this->contextConfigManager
->findByHostOrStandard($this->getHost());
}
/**
* Get host from current request.
*
* @return string|null
*/
public function getHost()
{
$request = $this->requestStack->getCurrentRequest();
return ($request) ? $request->getHost() : null;
}
/**
* Get current context config
*
* @return ContextConfig
*/
public function getContextConfig()
{
return $this->contextConfig;
}
}

知道吗?

我决定编写一个Twig函数来避免这种问题。这似乎是一个很好的解决方案。

class SiteExtension extends Twig_Extension
{
/**
* @var SiteHelper
*/
private $siteHelper;
/**
* Constructor.
*
* @param SiteHelper $siteHelper
*/
public function __construct(SiteHelper $siteHelper)
{
$this->siteHelper = $siteHelper;
}
/**
* {@inheritdoc}
*/
public function getFunctions()
{
return array(
new Twig_Function('site', array($this->siteHelper, 'getContext')),
);
}
}

最新更新