解决方案
通过创建自定义服务,我可以使用
$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() }}
惊人的!