【问题标题】:Add Twig global variable after kernel.request event在 kernel.request 事件后添加 Twig 全局变量
【发布时间】:2017-04-05 07:10:09
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: php symfony twig


    【解决方案1】:

    我决定写一个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')),
            );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多