1

我必须在每个操作中调用一些东西,例如从我的数据库中获取标签,或所有文章的数量等。
现在我总是在我想要显示它的每个操作中触发其他函数。有什么方法可以触发某些功能而不触发它们适合当前路线的动作,并在这些功能中分配一些树枝变量?

4

2 回答 2

2

你可以这样做:

  • 创建一个全局“假”操作,将接受特定“类型”的每个请求
  • 定义一个动作调度器(作为服务),它将路由到正确的动作(或用户$routersymfony2 对象,只要你将路由名称作为参数传递给你的“假”动作,它就会做同样的事情
  • 调用正确的动作后,做所有你需要做的事情

所以,像这样

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 回答