21

我有一个要与用户会话关联的实体。我创建了一项服务,以便我可以从任何地方获取此信息。

在服务中,我将实体 id 保存在会话变量中,在getEntity()方法中我获取会话变量,并使用学说找到实体并返回它。

这种方式到模板我应该可以调用{{ myservice.myentity.myproperty }}

问题是 myservice 到处都在使用,我不想在每个动作中都获取它并将其附加到视图数组中。

有没有办法让所有视图都可以访问服务,比如 session {{ app.session }}

4

2 回答 2

49

解决方案

通过创建自定义服务,我可以使用

$this->get('myservice');

这一切都由http://symfony.com/doc/current/book/service_container.html完成

但我会给你一些演示代码。

服务

第一个片段是实际的服务

<?php
namespace MyBundle\AppBundle\Extensions;

use Symfony\Component\HttpFoundation\Session;
use Doctrine\ORM\EntityManager;
use MyBundle\AppBundle\Entity\Patient;

class AppState
{
    protected $session;
    protected $em;

    function __construct(Session $session, EntityManager $em)
    {
        $this->session = $session;
        $this->em = $em;
    }

    public function getPatient()
    {
        $id = $this->session->get('patient');
        return isset($id) ? $em->getRepository('MyBundleStoreBundle:Patient')->find($id) : null;
    }
}

config.yml用这样的东西在你身上注册

services:
    appstate:
        class: MyBundle\AppBundle\Extensions\AppState
        arguments: [@session, @doctrine.orm.entity_manager]

现在我们可以像我之前所说的那样,在我们的控制器中获取服务

$this->get('myservice');

但由于这是一项全球服务,我不想在每个控制器和每个动作中都这样做

public function myAction()
{
    $appstate = $this->get('appstate');
    return array(
        'appstate' => $appstate
    );
}

所以现在我们去创建一个 Twig_Extension

树枝扩展

<?php
namespace MyBundle\AppBundle\Extensions;

use MyBundle\AppBundle\Extensions\AppState;

class AppStateExtension extends \Twig_Extension
{
    protected $appState;

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

    public function getGlobals() {
        return array(
            'appstate' => $this->appState
        );
    }

    public function getName()
    {
        return 'appstate';
    }

}

通过使用依赖注入,我们现在拥有了在名为 appstate 的 twig 扩展中创建的 AppState 服务

现在我们用 symfony 注册它(同样在services配置文件的部分内)

twig.extension.appstate:
    class: MyBundle\AppBundle\Extensions\AppStateExtension
    arguments: [@appstate]
    tags:
        - { name: twig.extension }

重要的部分是“标签”,因为这是 symfony 用来查找所有树枝扩展的东西

我们现在可以通过变量名在 twig 模板中使用我们的 appstate

{{ appstate.patient }}

或者

{{ appstate.getPatient() }}

惊人的!

于 2011-10-05T08:04:42.817 回答
2

也许你可以在你的行动中试试这个?: $this->container->get('template')->addGlobal($name, $value)

于 2011-10-04T17:13:05.410 回答