我目前正在开发SAAS项目,每个客户都可以通过个性化网址(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: MultisiteBundle\Listener\SiteListener
arguments:
- "@multisite.helper.site"
- "@twig"
tags:
- { name: kernel.event_listener, event: kernel.request, method: addContextsToTwigGlobal }
SiteHelper服务
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;
}
}
有什么想法吗?
答案 0 :(得分:0)
我决定写一个Twig function来避免这种问题。这似乎是一个很好的解决方案。
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')),
);
}
}