【问题标题】:Symfony 2.1 - Custom Json Annotation ListenerSymfony 2.1 - 自定义 Json 注释监听器
【发布时间】:2013-02-06 02:11:58
【问题描述】:

对于 Symfony 2.1 项目,我正在尝试创建一个新注释 @Json(),它将注册一个侦听器,该侦听器将在我返回一个数组时自动创建 JsonResponse 对象。我已经让它工作了,但由于某种原因,即使在没有 @Json 注释的方法上,也总是调用了侦听器。我假设我的方法有效,因为 Sensio 额外捆绑包使用 @Template 注释执行此操作。

这是我的注释代码。

<?php

namespace Company\Bundle\Annotations;

/**
 * @Annotation
 */
class Json extends \Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationAnnotation
{
    public function getAliasName()
    {
        return 'json';
    }
}

这是我的监听器代码。

<?php

namespace Company\Bundle\Listener\Response\Json;

class JsonListener
{
    //..

    public function onKernelView(GetResponseForControllerResultEvent $event)
    {
        $request = $event->getRequest();
        $data = $event->getControllerResult();

        if(is_array($data) || is_object($data)) {
            if ($request->attributes->get('_json')) {
                $event->setResponse(new JsonResponse($data));
            }
        }
    }
}

这是我对监听器的 yaml 定义。

json.listener:
            class:      Company\Bundle\Listener\Response\Json
            arguments:  [@service_container]
            tags:
                - { name: kernel.event_listener, event: kernel.view, method: onKernelView }

我显然在这里遗漏了一些东西,因为它被注册为 kernel.view 监听器。如何更改它以便仅在控制器操作上存在 @Json() 注释时调用它?

【问题讨论】:

  • 这对我来说似乎是正确的,尝试找出 _json 属性的设置位置。
  • @igorw 显然我一直都正确 - 我只是认为我错了,因为我很困惑我应该在侦听器中处理注释,而不是相反。不过还是谢谢。

标签: php symfony symfony-2.1


【解决方案1】:

不要假装是确定的答案。

我不确定你为什么要扩展ConfigurationAnnotation:它的构造函数接受array,但你不需要对注释进行任何配置。相反,实现ConfigurationInterface

namespace Company\Bundle\Annotations;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface;

/**
 * @Annotation
 */
class Json implements ConfigurationInterface
{
    public function getAliasName()
    {
        return 'json';
    }

    public function allowArray()
    {
        return false;
    }
}

Sensio ControllerListener 来自 SensionFrameworkExtraBundle 将读取您的注释(将类与方法注释合并)并执行此检查:

if ($configuration instanceof ConfigurationInterface) {
    if ($configuration->allowArray()) {
        $configurations['_'.$configuration->getAliasName()][] = $configuration;
    } else {
        $configurations['_'.$configuration->getAliasName()] = $configuration;
    }
}

设置以_ 为前缀的请求属性。您正在正确检查_json,所以它应该可以工作。尝试在您的视图事件侦听器中转储$request-&gt;attributes。确保您的json.listener 服务也正确加载(使用php app/console container:debug &gt;&gt; container.txt 转储它们)。

如果不起作用,请尝试添加一些调试和打印语句here(在您的供应商文件夹中找到ControllerListener.php):

var_dump(array_keys($configurations)); // Should contain _json

记得在编辑之前复制一份,否则更新依赖时 Composer 会抛出错误。

【讨论】:

  • 这就是我所需要的——我没有正确理解注释被设置为请求属性,我应该在侦听器中检查它们。 +1
  • @JarrodNettles 那么问题出在哪里?
  • “问题”是甚至调用了侦听器。我正在研究注释应该如何表现不正确。对不起,如果这没有意义 - 无论哪种方式,顿悟。
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2012-08-30
相关资源
最近更新 更多