服务方法作为树枝全局变量

service method as twig global variable

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

我很期待能打电话给

{% if portfolio_user %}

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

我必须为此编写扩展程序或帮助程序吗? 更简单的方法是什么?

谢谢!

一种方法是使用 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

另一种方法是完全避免 twig 全局,只进行 twig 扩展调用。 http://symfony.com/doc/current/cookbook/templating/twig_extension.html

两种方式都很好。

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

你可以阅读这个:

The app variable is available everywhere and gives access to many commonly needed objects and values. It is an instance of GlobalVariables.

GlobalVariablesSymfony\Bundle\FrameworkBundle\Templating\GlobalVariables

我从来没有这样做过,但我认为一种方法是忽略此 class 以便满足您的特殊需求。

您可以将自定义服务定义为 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. 设置您的捆绑包(例如:MyVendor/MyBundle)

    $ app/console generate:bundle
    

  1. 在您的包目录中,在 DependencyInjection 文件夹中创建 MyService.php class 文件。

  1. 在此class文件中,创建函数

    public function getExample(){
        return "it works!!!";
    }
    

  1. app/config/services.yml中像这样创建一个新服务:

    myvendor.mybundle.myservice
          class: MyVendor\MyBundle\DependencyInjection\MyService
    

  1. app/config/config.yml下的twig配置部分

    twig:
        globals:
            mystuff: '@myvendor.mybundle.myservice'
    

  1. 然后在你的树枝模板中你可以像这样引用变量:

     {{ mystuff.example }}
    

免责声明

这就是我让它工作的方式....

希望这对您有所帮助。