/** * @dataProvider getTestData */ public function testGenerate($class, $method, array $arguments) { $generator = new ProxyClassGenerator(); $metadata = new ServiceMetadata(); $reflection = new \ReflectionClass($class); $methodMetadata = new MethodMetadata($reflection->getMethod($method)); $methodMetadata->setRoles(array('ROLE_FOO')); $methodMetadata->setReturnPermissions(array('PERMISSION_RETURN')); $metadata->addMethod($method, $methodMetadata); $definition = new Definition(); $definition->setClass($reflection->getName()); list($className, $proxy) = $generator->generate($definition, $metadata); $tmpFile = tempnam(sys_get_temp_dir(), 'proxy'); file_put_contents($tmpFile, $proxy); require_once $tmpFile; unlink($tmpFile); $className = 'SecurityProxies\\' . $className; $proxyClass = new $className(); $mock = $this->getMockBuilder('JMS\\SecurityExtraBundle\\Security\\Authorization\\Interception\\MethodSecurityInterceptor')->disableOriginalConstructor()->getMock(); $mock->expects($this->once())->method('invoke')->will($this->returnValue($return = new \stdClass())); $proxyClass->jmsSecurityExtraBundle__setMethodSecurityInterceptor($mock); $this->assertSame($return, call_user_func_array(array($proxyClass, $method), $arguments)); }
/** * Generates the proxy class * * @param Definition $definition * @param ServiceMetadata $metadata * @return array<string, string> */ public function generate(Definition $definition, ServiceMetadata $metadata) { list($className, $proxy) = $this->getClassDefinition($definition); foreach ($metadata->getMethods() as $name => $method) { $reflection = $method->getReflection(); $proxy .= $this->getMethodDefinition($reflection); $proxy .= ' static $jmsSecurityExtra__metadata = ' . $this->getMethodSecurityMetadata($method) . '; '; $proxy .= ' return '; $proxy .= '$this->jmsSecurityExtraBundle__methodSecurityInterceptor->invoke( '; $proxy .= ' ' . $this->getSecureMethodInvocation($method) . ', '; $proxy .= ' $jmsSecurityExtra__metadata '; $proxy .= ' );'; $proxy .= ' } '; } return array($className, substr($proxy, 0, -6) . '}'); }