Ejemplo n.º 1
0
 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]);
 }
Ejemplo n.º 4
0
 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));
 }
Ejemplo n.º 5
0
 /**
  * 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);
 }
Ejemplo n.º 7
0
 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;
    }
Ejemplo n.º 9
0
 /**
  * @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')));
 }
Ejemplo n.º 10
0
    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')
        ));
    }
Ejemplo n.º 11
0
 public function testGetUserClassName()
 {
     $this->assertEquals('Foo', ClassUtils::getUserClass('Foo'));
     $this->assertEquals('Bar', ClassUtils::getUserClass('FOO\\__CG__\\Bar'));
 }
Ejemplo n.º 12
0
 /**
  * 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));
 }