服务方法作为树枝全局变量
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.
GlobalVariables
是 Symfony\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() %}
希望对您有所帮助
我也遇到了一些困难,最后通过执行以下操作解决了它:
设置您的捆绑包(例如:MyVendor/MyBundle)
$ app/console generate:bundle
- 在您的包目录中,在 DependencyInjection 文件夹中创建 MyService.php class 文件。
在此class文件中,创建函数
public function getExample(){
return "it works!!!";
}
在app/config/services.yml中像这样创建一个新服务:
myvendor.mybundle.myservice
class: MyVendor\MyBundle\DependencyInjection\MyService
在app/config/config.yml下的twig配置部分
twig:
globals:
mystuff: '@myvendor.mybundle.myservice'
然后在你的树枝模板中你可以像这样引用变量:
{{ mystuff.example }}
免责声明
这就是我让它工作的方式....
希望这对您有所帮助。
在我的 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.
GlobalVariables
是 Symfony\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() %}
希望对您有所帮助
我也遇到了一些困难,最后通过执行以下操作解决了它:
设置您的捆绑包(例如:MyVendor/MyBundle)
$ app/console generate:bundle
- 在您的包目录中,在 DependencyInjection 文件夹中创建 MyService.php class 文件。
在此class文件中,创建函数
public function getExample(){ return "it works!!!"; }
在app/config/services.yml中像这样创建一个新服务:
myvendor.mybundle.myservice class: MyVendor\MyBundle\DependencyInjection\MyService
在app/config/config.yml下的twig配置部分
twig: globals: mystuff: '@myvendor.mybundle.myservice'
然后在你的树枝模板中你可以像这样引用变量:
{{ mystuff.example }}
免责声明
这就是我让它工作的方式....
希望这对您有所帮助。