我必须在每个操作中调用一些东西,例如从我的数据库中获取标签,或所有文章的数量等。
现在我总是在我想要显示它的每个操作中触发其他函数。有什么方法可以触发某些功能而不触发它们适合当前路线的动作,并在这些功能中分配一些树枝变量?
问问题
769 次
2 回答
2
你可以这样做:
- 创建一个全局“假”操作,将接受特定“类型”的每个请求
- 定义一个动作调度器(作为服务),它将路由到正确的动作(或用户
$router
symfony2 对象,只要你将路由名称作为参数传递给你的“假”动作,它就会做同样的事情 - 调用正确的动作后,做所有你需要做的事情
所以,像这样
public function actionDispatcher(Request $request, $route_name, $parameters)
{
/* retrieve the router */
$router = $this->get('router');
$myRouteDefaultsArray = $router->getRouteCollection->get('route_name')->getDefaults();
/* retrieve the correct action */
$myAction = $myRouteDefaultsArray['_controller'];
/*use your action here */
[.....]
/* fire your functions here */
[.....]
/* render the twig template along your variables here */
[.....]
}
}
于 2012-11-16T10:07:36.790 回答
2
感谢DonCallisto,我做到了:
<?php
namespace Puzzle\InfobusBundle\EventListener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bundle\TwigBundle\TwigEngine;
class MyListener{
protected $doctrine;
protected $templating;
protected $session;
protected $container;
/**
* @param ContainerInterface $container
*/
public function __construct($security, $doctrine, $session, $templating, $container){
$this->doctrine=$doctrine;
$this->session=$session;
$this->templating=$templating;
$this->container=$container;
}
public function onKernelRequest() {
$this->container->get('twig')->addGlobal('myVar', 1234);
}
在 app/config/config.yml 中:
services:
acme_my.exception.my_listener:
class: Acme\MyBundle\EventListener\MyListener
arguments: ["@security.context", "@doctrine", "@session", "@templating", "@service_container"]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
现在 onKernelRequest 中的代码会在每个页面上触发代码,我可以将一些变量发送到 twig 模板。
于 2012-11-16T17:09:41.500 回答