private function getUserClass($class) { if (class_exists('CG\\Core\\ClassUtils', true)) { return \CG\Core\ClassUtils::getUserClass($class); } return $class; }
public function generate(\ReflectionClass $originalClass, PhpClass $genClass) { $methods = ReflectionUtils::getOverrideableMethods($originalClass); if (null !== $this->filter) { $methods = array_filter($methods, $this->filter); } if (empty($methods)) { return; } if (!empty($this->requiredFile)) { $genClass->addRequiredFile($this->requiredFile); } $interceptorLoader = new PhpProperty(); $interceptorLoader->setName($this->prefix . 'loader')->setVisibility(PhpProperty::VISIBILITY_PRIVATE); $genClass->setProperty($interceptorLoader); $loaderSetter = new PhpMethod(); $loaderSetter->setName($this->prefix . 'setLoader')->setVisibility(PhpMethod::VISIBILITY_PUBLIC)->setBody('$this->' . $this->prefix . 'loader = $loader;'); $genClass->setMethod($loaderSetter); $loaderParam = new PhpParameter(); $loaderParam->setName('loader')->setType('CG\\Proxy\\InterceptorLoaderInterface'); $loaderSetter->addParameter($loaderParam); $interceptorCode = '$ref = new \\ReflectionMethod(%s, %s);' . "\n" . '$interceptors = $this->' . $this->prefix . 'loader->loadInterceptors($ref, $this, array(%s));' . "\n" . '$invocation = new \\CG\\Proxy\\MethodInvocation($ref, $this, array(%s), $interceptors);' . "\n\n" . 'return $invocation->proceed();'; foreach ($methods as $method) { $params = array(); foreach ($method->getParameters() as $param) { $params[] = '$' . $param->name; } $params = implode(', ', $params); $genMethod = PhpMethod::fromReflection($method)->setBody(sprintf($interceptorCode, var_export(ClassUtils::getUserClass($method->class), true), var_export($method->name, true), $params, $params))->setDocblock(null); $genClass->setMethod($genMethod); } }
public function matchesMethod(\ReflectionMethod $method) { $userClass = ClassUtils::getUserClass($method->class); $metadata = $this->metadataFactory->getMetadataForClass($userClass); if (null === $metadata) { return false; } return isset($metadata->methodMetadata[$method->name]); }
protected function getControllerCode() { $class = get_class($this->controller[0]); if (class_exists('CG\\Core\\ClassUtils')) { $class = ClassUtils::getUserClass($class); } $r = new \ReflectionClass($class); $m = $r->getMethod($this->controller[1]); $code = file($r->getFilename()); return ' ' . $m->getDocComment() . "\n" . implode('', array_slice($code, $m->getStartline() - 1, $m->getEndLine() - $m->getStartline() + 1)); }
/** * Modifies the Request object to apply configuration information found in * controllers annotations like the template to render or HTTP caching * configuration. * * @param FilterControllerEvent $event A FilterControllerEvent instance */ public function onKernelController(FilterControllerEvent $event) { if (!is_array($controller = $event->getController())) { return; } $object = new \ReflectionClass(ClassUtils::getUserClass(get_class($controller[0]))); $method = $object->getMethod($controller[1]); $request = $event->getRequest(); foreach ($this->reader->getMethodAnnotations($method) as $configuration) { if ($configuration instanceof ConfigurationInterface) { $request->attributes->set('_' . $configuration->getAliasName(), $configuration); } } }
/** * Guesses and returns the template name to render based on the controller * and action names. * * @param array $controller An array storing the controller object and action method * @param Request $request A Request instance * @param string $engine * @return TemplateReference template reference * @throws \InvalidArgumentException */ public function guessTemplateName($controller, Request $request, $engine = 'twig') { $className = get_class($controller[0]); // When JMSSecurityExtraBundle is used it generates Controller classes as MyAccountController__CG__ if (class_exists('CG\\Core\\ClassUtils')) { $className = ClassUtils::getUserClass($className); } if (!preg_match('/Controller\\\\(.+)Controller$/', $className, $matchController)) { throw new \InvalidArgumentException(sprintf('The "%s" class does not look like a controller class (it must be in a "Controller" sub-namespace and the class name must end with "Controller")', get_class($controller[0]))); } if (!preg_match('/^(.+)Action$/', $controller[1], $matchAction)) { throw new \InvalidArgumentException(sprintf('The "%s" method does not look like an action method (it does not end with Action)', $controller[1])); } $bundle = $this->getBundleForClass($className); return new TemplateReference($bundle->getName(), $matchController[1], $matchAction[1], $request->getRequestFormat(), $engine); }
protected function guessTemplateName($controller, Request $request, $engine = 'twig') { $controllerClass = get_class($controller[0]); $userClass = ClassUtils::getUserClass($controllerClass); if ($controllerClass === $userClass) { return parent::guessTemplateName($controller, $request, $engine); } if (!preg_match('/Controller\\\\(.+)Controller$/', $userClass, $matchController)) { throw new \InvalidArgumentException(sprintf('The "%s" class does not look like a controller class (it must be in a "Controller" sub-namespace and the class name must end with "Controller")', $userClass)); } if (!preg_match('/^(.+)Action$/', $controller[1], $matchAction)) { throw new \InvalidArgumentException(sprintf('The "%s" method does not look like an action method (it does not end with Action)', $controller[1])); } $bundle = $this->getBundleForClass($userClass); return new TemplateReference($bundle->getName(), $matchController[1], $matchAction[1], $request->getRequestFormat(), $engine); }
/** * Gets the code from the template * @param Twig_Template $template * @return HTML to display */ public function getCode($template) { $controllerClass = get_class($this->controller[0]); if (class_exists('CG\\Core\\ClassUtils')) { $controllerClass = ClassUtils::getUserClass($controllerClass); } $methodName = $this->controller[1]; $controllerLink = $this->githubLocator->getMethodClassLink($controllerClass, $methodName); $templateLink = $this->githubLocator->getTemplateLink($template->getTemplateName()); $controller = $this->getControllerCode($controllerClass, $methodName); $template = $this->getTemplateCode($template); // remove the code block $template = str_replace('{% set code = code(_self) %}', '', $template); return <<<EOF <h4><strong>Controller Code - <a href="{$controllerLink}">Github</a></strong></h4> <pre class="prettyprint">{$controller}</pre> <h4><strong>Template Code - <a href="{$templateLink}">Github</a></strong></h4> <pre class="prettyprint">{$template}</pre> EOF; }
/** * @param array<PointcutInterface> $pointcuts * @param array<string,string> $interceptors */ private function processDefinition(Definition $definition, $pointcuts, &$interceptors) { if ($definition->isSynthetic()) { return; } // Symfony 2.6 getFactory method // TODO: Use only getFactory when bumping require to Symfony >= 2.6 if (method_exists($definition, 'getFactory') && $definition->getFactory()) { return; } if (!method_exists($definition, 'getFactory') && ($definition->getFactoryService() || $definition->getFactoryClass())) { return; } if ($originalFilename = $definition->getFile()) { require_once $originalFilename; } if (!class_exists($definition->getClass())) { return; } $class = new \ReflectionClass($definition->getClass()); // check if class is matched $matchingPointcuts = array(); foreach ($pointcuts as $interceptor => $pointcut) { if ($pointcut->matchesClass($class)) { $matchingPointcuts[$interceptor] = $pointcut; } } if (empty($matchingPointcuts)) { return; } $this->addResources($class, $this->container); if ($class->isFinal()) { return; } $classAdvices = array(); foreach (ReflectionUtils::getOverrideableMethods($class) as $method) { if ('__construct' === $method->name) { continue; } $advices = array(); foreach ($matchingPointcuts as $interceptor => $pointcut) { if ($pointcut->matchesMethod($method)) { $advices[] = $interceptor; } } if (empty($advices)) { continue; } $classAdvices[$method->name] = $advices; } if (empty($classAdvices)) { return; } $interceptors[ClassUtils::getUserClass($class->name)] = $classAdvices; $proxyFilename = $this->cacheDir . '/' . str_replace('\\', '-', $class->name) . '.php'; $generator = new InterceptionGenerator(); $generator->setFilter(function (\ReflectionMethod $method) use($classAdvices) { return isset($classAdvices[$method->name]); }); if ($originalFilename) { $relativeOriginalFilename = $this->relativizePath($proxyFilename, $originalFilename); if ($relativeOriginalFilename[0] === '.') { $generator->setRequiredFile(new RelativePath($relativeOriginalFilename)); } else { $generator->setRequiredFile($relativeOriginalFilename); } } $enhancer = new Enhancer($class, array(), array($generator)); $enhancer->setNamingStrategy(new DefaultNamingStrategy('EnhancedProxy' . substr(md5($this->container->getParameter('jms_aop.cache_dir')), 0, 8))); $enhancer->writeClass($proxyFilename); $definition->setFile($proxyFilename); $definition->setClass($enhancer->getClassName($class)); $definition->addMethodCall('__CGInterception__setLoader', array(new Reference('jms_aop.interceptor_loader'))); }
private function processDefinition(Definition $definition, $pointcuts, &$interceptors) { if ($definition->isSynthetic()) { return; } if ($definition->getFactoryService() || $definition->getFactoryClass()) { return; } if ($file = $definition->getFile()) { require_once $file; } $class = new \ReflectionClass($definition->getClass()); // check if class is matched $matchingPointcuts = array(); foreach ($pointcuts as $interceptor => $pointcut) { if ($pointcut->matchesClass($class)) { $matchingPointcuts[$interceptor] = $pointcut; } } if (empty($matchingPointcuts)) { return; } $this->addResources($class, $this->container); if ($class->isFinal()) { return; } $classAdvices = array(); foreach ($class->getMethods(\ReflectionMethod::IS_PROTECTED | \ReflectionMethod::IS_PUBLIC) as $method) { if ($method->isFinal()) { continue; } $advices = array(); foreach ($matchingPointcuts as $interceptor => $pointcut) { if ($pointcut->matchesMethod($method)) { $advices[] = $interceptor; } } if (empty($advices)) { continue; } $classAdvices[$method->name] = $advices; } if (empty($classAdvices)) { return; } $interceptors[ClassUtils::getUserClass($class->name)] = $classAdvices; $generator = new InterceptionGenerator(); $generator->setFilter(function(\ReflectionMethod $method) use ($classAdvices) { return isset($classAdvices[$method->name]); }); if ($file) { $generator->setRequiredFile($file); } $enhancer = new Enhancer($class, array(), array( $generator )); $enhancer->writeClass($filename = $this->cacheDir.'/'.str_replace('\\', '-', $class->name).'.php'); $definition->setFile($filename); $definition->setClass($enhancer->getClassName($class)); $definition->addMethodCall('__CGInterception__setLoader', array( new Reference('jms_aop.interceptor_loader') )); }
public function testGetUserClassName() { $this->assertEquals('Foo', ClassUtils::getUserClass('Foo')); $this->assertEquals('Bar', ClassUtils::getUserClass('FOO\\__CG__\\Bar')); }
/** * Generate the code for an instantiation of a \ReflectionMethod object * * @return string */ public function generateReflectionDeclarationCode() { return sprintf('$reflection = new \\ReflectionMethod(%s, %s);', var_export(ClassUtils::getUserClass($this->className), true), var_export($this->methodName, true)); }