Php 自定义注释与来自jms/SecurityExtraBundle的@secure冲突

Php 自定义注释与来自jms/SecurityExtraBundle的@secure冲突,php,symfony,annotations,Php,Symfony,Annotations,我编写了一个注释,当AJAX请求(XMLHttpRequest)未调用该操作时,该注释会抛出AccesDeniedException 它可以工作,但是当我想使用来自JMS/SecurityExtraBundle的@Secure(roles=“A”)注释时,它就不能工作了,就像我忽略了我的自定义异常一样 控制器 注释 听众 知道我为什么不能同时使用@Secure(…)和@XMLHttpRequest吗 编辑: 服务.yml services: annotations.xmlhttpr

我编写了一个注释,当AJAX请求(XMLHttpRequest)未调用该操作时,该注释会抛出AccesDeniedException

它可以工作,但是当我想使用来自JMS/SecurityExtraBundle的@Secure(roles=“A”)注释时,它就不能工作了,就像我忽略了我的自定义异常一样

控制器

注释

听众

知道我为什么不能同时使用
@Secure(…)
@XMLHttpRequest

编辑:

服务.yml

services:
    annotations.xmlhttprequest:
        class: Mendrock\Bundle\ExtraBundle\Listener\EventListener
        tags: [{name: kernel.event_listener, event: kernel.controller, method: onKernelController}]
        arguments: [@annotation_reader]

升级到Symfony 2.1后,我遇到了相同的问题

根据我的调查,问题在于无论何时使用JMS SecurityExtraBundle的注释,它都会生成代理类。生成的代理类的问题是,自定义注释没有被代理,这就是注释似乎丢失的原因


根据作者的说法,使用AOP(JMSAopBundle提供的工具)重写或使用
ClassUtils::getUserClass

,感谢suihock指出这一点:

$class = \CG\Core\ClassUtils::getUserClass($controller[0]);
$method = new \ReflectionMethod($class, $controller[1]);

当我想添加自己的注释时,我遇到了同样的问题。使用
ClassUtils::getUserClass
的解决方案将不起作用(如果使用Symfony 2.3会有所不同的话)

因为我们只使用来自JMS\SecurityExtraBundle的
@Secure
注释,所以我改为使用我们的代码库


此捆绑包仅提供
@Secure
,不会对您的控制器进行巫毒把戏。

您好,请同时提供将ControllerListener作为服务/监听器加载的配置。那么,我们如何才能做到这一点?我们需要再做一个代理吗?我还将尝试用aop范式解决我的问题。我询问了JMSSecurityExtraBundle的作者,并参考他的解决方案更新了我的答案。
namespace Mendrock\Bundle\ExtraBundle\Listener;

use Doctrine\Common\Annotations\Reader;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Mendrock\Bundle\ExtraBundle\Annotation\XmlHttpRequest;

class EventListener {

    private $reader;

    public function __construct(Reader $reader) {
        $this->reader = $reader;
    }

    /**
     * This event will fire during any controller call
     */
    public function onKernelController(FilterControllerEvent $event) {

        if (!is_array($controller = $event->getController())) { 
            return;
        }
        $method = new \ReflectionMethod($controller[0], $controller[1]);

        foreach ($this->reader->getMethodAnnotations($method) as $configuration) {
            if ($configuration instanceof XmlHttpRequest) {
                $configuration->execute($event);
            }
        }
    }
}
services:
    annotations.xmlhttprequest:
        class: Mendrock\Bundle\ExtraBundle\Listener\EventListener
        tags: [{name: kernel.event_listener, event: kernel.controller, method: onKernelController}]
        arguments: [@annotation_reader]
$class = \CG\Core\ClassUtils::getUserClass($controller[0]);
$method = new \ReflectionMethod($class, $controller[1]);