服务方法作为twig全局变量

时间:2015-03-04 19:08:32

标签: php symfony service global-variables twig

在我的symfony2应用程序中,我有一个getPorfolioUser方法,它返回一个特定的用户变量。

我期待能够致电

  

{%if portfolio_user%}

在树枝上。我不明白如何将其设置为全局变量,因为我在印象中只能设置固定元素或服务而不是服务'方法

我是否有义务为此编写扩展或帮助? 这样做的简单方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:14)

您可以将自定义服务定义为twig globals variable,如下所示:

config.yml 中的

# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    globals:
        myGlobaService: "@acme.demo_portfolio_service"  #The id of your service

使用Twig文件

{% if myGlobaService.portfolio_user() %}

希望这个帮助

答案 1 :(得分:5)

一种方法是使用CONTROLLER事件监听器。我喜欢使用CONTROLLER而不是REQUEST,因为它确保所有常规请求监听器已经完成了它们的工作。

use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ProjectEventListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
    return array
    (
        KernelEvents::CONTROLLER => array(
            array('onControllerProject'),
        ),
    );
}
private $twig;
public function __construct($twig)
{
    $this->twig = $twig;
}
public function onControllerProject(FilterControllerEvent $event)
{
    // Generate your data
    $project = ...;

    // Twig global
    $this->twig->addGlobal('project',$project);    
}

# services.yml
cerad_project__project_event_listener:
    class: ...\ProjectEventListener
    tags:
        - { name: kernel.event_subscriber }
    arguments:
        - '@twig'

听众在此处记录:http://symfony.com/doc/current/cookbook/service_container/event_listener.html

另一种方法是完全避免树枝全球化,只是进行树枝延伸调用。 http://symfony.com/doc/current/cookbook/templating/twig_extension.html

无论哪种方式都运作良好。

答案 2 :(得分:1)

当你看到这里: http://symfony.com/doc/current/reference/twig_reference.html#app

您可以阅读:

  

app变量随处可用,可以访问许多变量   通常需要的对象和价值观。这是一个例子   GlobalVariables。

GlobalVariablesSymfony\Bundle\FrameworkBundle\Templating\GlobalVariables

我从来没有这样做,但我认为有一种方法可以覆盖这个课程,以满足您的特殊需求。

答案 3 :(得分:0)

我也遇到了一些困难,最后通过以下方式解决了这个问题:

  1. 设置您的捆绑包(例如:MyVendor / MyBundle)

    $ app/console generate:bundle
    
    1. 在您的捆绑目录中,在 DependencyInjection 文件夹中创建 MyService.php 类文件。
      1. 在此类文件中,创建函数

        public function getExample(){
            return "it works!!!";
        }
        
        1. app / config / services.yml 中创建一个新服务:

          myvendor.mybundle.myservice
                class: MyVendor\MyBundle\DependencyInjection\MyService
          
          1. twig 配置栏目 app / config / config.yml

            twig:
                globals:
                    mystuff: '@myvendor.mybundle.myservice'
            
            1. 然后在您的树枝模板中,您可以像这样引用变量:

               {{ mystuff.example }}
              
            2. <强>声明

              这就是我开始工作的方式......

              希望这会有所帮助。