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