在kernel.request事件

时间:2017-04-05 07:10:09

标签: php symfony twig

我目前正在开发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;
    }
}

有什么想法吗?

1 个答案:

答案 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')),
        );
    }
}