在模板中调用服务

Call services in templates

正在关注 我无法从模板调用服务。我做的和答案中的完全一样,但是我在模板中得到 'Variable "newmessages" does not exist'。

我也试过在父模板中返回服务,但是从来没有调用父模板,因为没有请求它,请求只对子模板完成。

public function indexAction(){
    $locationService = $this->container->get('newmessages');


    return $this->render(
        'MedAppCrudBundle:UserBackend\Message:index.html.twig',
        array('newmessages'=>$locationService->methodToCalculate())

    );
}

如何从父模板调用服务?上一个问题的答案无效。

你的问题的答案很简单。您将服务公开为一个 twig 全局变量。根据您的示例,您应该添加类似于 config.yml

的内容
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    globals:
        newmessages: "@newmessages"

要在你的树枝中使用它,你只需写 {{ newmessages.methodToCalculate() }}

您可以在 How to Inject Variables into all Templates 文档页面中阅读更多相关信息。

这里有一个更详细的例子:

// Add this to config.yml
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    globals:
        newmessages: "@newmessages"

// Add this to services.yml (or if you're using older version of Symfony, add it to config.yml as well)
services:
    newmessages:
        class: App\YourBundle\Service\NewMessages

// The NewMessages service class
<?php

namespace App\YourBundle\Service;

class NewMessages {

    public function methodToCalculate() {
        return "location calculated.";
    }

}

?>

 // in your twig template do this
 {{ newmessages.methodToCalculate() }}  // outputs "location calculated."

您可以将您的服务公开为一个 twig 函数并在 twig 语句中使用它。 See the full doc here。 例如,将扩展名定义为:

services.yml

#########  TWIG EXTENSION
    acme.message_helper_twig_extension:
        class: Acme\MessageBundle\Twig\MessageHelperExtension
        arguments: [@newmessages]
        tags:
            - { name: twig.extension }

并实现如下:

namespace Acme\MessageBundle\Twig\MessageHelperExtension;



class MessageHelperExtension extends \Twig_Extension {


    protected $newMessages;


    function __construct($newMessages)
    {
        $this->newMessages = $newMessages;
    }



    public function getFunctions()
    {
        return array(
            //////////////////////////////////
            'twig_method_reference_name'=> new \Twig_Function_Method($this, 'getMessages'),
        );
    }

    public function getMessages()
    {
        return $this->newMessages->getMessages()
    }
    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'message_helper';
    }

} 

然后你可以在树枝中使用它:

{{ twig_method_reference_name() }}

希望对您有所帮助