Php 模板中的呼叫服务

Php 模板中的呼叫服务,php,symfony,templates,twig,Php,Symfony,Templates,Twig,我无法从模板中调用服务。我做的和答案中的完全一样,但是我得到了模板中的“变量”newmessages“不存在” 我还尝试在父模板中返回服务,但从未调用父模板,因为没有对它的请求,请求只对子模板执行 public function indexAction(){ $locationService = $this->container->get('newmessages'); return $this->render( 'MedAppCrudBun

我无法从模板中调用服务。我做的和答案中的完全一样,但是我得到了模板中的“变量”newmessages“不存在”

我还尝试在父模板中返回服务,但从未调用父模板,因为没有对它的请求,请求只对子模板执行

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


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

    );
}

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

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

twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    globals:
        newmessages: "@newmessages"
要在细枝中使用它,只需编写
{{{newmessages.methodToCalculate()}}

您可以在文档页面中阅读更多关于此的信息

下面是一个更详细的示例:

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



您可以将服务公开为细枝函数,并在细枝语句中使用它。 例如,将扩展定义为:

服务.yml

#########  TWIG EXTENSION
    acme.message_helper_twig_extension:
        class: Acme\MessageBundle\Twig\MessageHelperExtension
        arguments: [@newmessages]
        tags:
            - { name: twig.extension }
并按以下步骤实施:

然后,您可以在细枝中使用它作为:

{{ twig_method_reference_name() }}

希望这有助于

将其公开为一个小树枝扩展请您详细说明一下好吗?嗨@George检查我的回答如果您看到错误,请编辑错误的模板。您只能在
MedAppCrudBundle:UserBackend\Message:index.html.twig
中访问此变量,但您可以将其传递给其他模板。嗯,如果它是全局声明的,是否没有问题?我只想在少数几个模板中使用它,而能够在所有模板中使用它对我来说似乎很糟糕。如果你不使用你的服务,那么这两种方式都已经加载了,所以基本上是一样的。如果您使用
惰性服务
,则只有在您实际从服务调用方法时才会实例化它。我正在尝试从命名空间“MedApp\CrudBundle\MedAppCrudBundle\Services”加载类“NewMessagesService”。您是否忘记了另一个名称空间的“use”语句。我用一个过于简单的例子更新了我的答案。所以每次我有一个带有变量的父细枝,我必须定义一个服务,然后将它定义为细枝扩展?听起来像是很多毫无意义的工作,而且似乎在每个控制器中调用它将是一个更好的解决方案。还是我错了?细枝扩展只是向细枝层公开服务的一种方式。假设
newmessages
是一个服务,在公开的方法中,该服务将新消息的数量返回到细枝。虽然这在技术上是一个有效的答案,但我相信这会给等式增加一点复杂性——多了一个服务,多了一个类(这是对原始类的包装)。在IMHO中,细枝扩展主要用于进一步扩展核心细枝功能,如附加功能和过滤器。
 // in your twig template do this
 {{ newmessages.methodToCalculate() }}  // outputs "location calculated."
#########  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() }}