在所有模板中注入全局变量

时间:2012-07-19 09:49:50

标签: php symfony1 symfony-1.4

我想问一下,是否有可能添加全局变量,例如sf_paramssf_datasf_usersf_context或是否有可能扩展一个那些?

我想在运行时(部分,模板和操作)中更改一些应用程序参数。 现在sf文档建议使用类似app.yml的东西,但我的问题是,我需要在设置这个参数之前执行一些代码。因此需要非常动态地设置它们,app.yml无法实现这一点。

你们中的任何人都有一些建议如何将新的全局变量或全局对象实现到symfony中,几乎可以从项目的任何地方访问它?

2 个答案:

答案 0 :(得分:2)

存储配置数据的最佳位置是sfConfig对象,该对象在项目的任何部分都可用。因此,您必须在数据库中查询配置数据,并通过sfConfig::set('variableName', $value)填充sfConfig对象。所以:

  1. 创建一个静态类,它将查询数据库并填充sfConfig对象
  2. 添加一个过滤器,该过滤器将调用此类以在任何请求时执行其作业。

答案 1 :(得分:2)

我同意@olivierw的解决方案。

对于个人项目,我有一个名为Config的表,我使用过滤器加载内容,因此我可以访问项目中的任何位置。

过滤器lib/filter/configFilter.php

<?php

class configFilter extends sfFilter
{
  public function execute ($filterChain)
  {
    // get the config
    $configs = Doctrine_Core::getTable('Config')>findAll();

    foreach($configs as $config)
    {
      sfConfig::set('my_config_'.$config->getName(), $config->getContent());
    }

    // execute next filter
    $filterChain->execute();
  }
}

apps/frontend/config/filters.yml

rendering: ~

configFilter:
  class: configFilter

security:  ~

现在您可以使用以下方式访问任何信息:

sfConfig::get('my_config_key');

schema.yml表的Config

Config:
  columns:
    name:     { type: string(255) }
    content:  { type: string(1000) }