* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * AnnotatedRouteControllerLoader is an implementation of AnnotationClassLoader * that sets the '_controller' default based on the class and method names. * * It also parse the @Method annotation. * * @author Fabien Potencier */ class AnnotatedRouteControllerLoader extends AnnotationClassLoader { /** * Configures the _controller default parameter and eventually the _method * requirement of a given Route instance. * * @param Route $route A Route instance * @param ReflectionClass $class A ReflectionClass instance * @param ReflectionMethod $method A ReflectionClass method */ protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot) { // controller $classAnnot = $this->reader->getClassAnnotation($class, $this->routeAnnotationClass); if ($classAnnot instanceof FrameworkExtraBundleRoute && $service = $classAnnot->getService()) { $route->setDefault('_controller', $service.':'.$method->getName()); } else { $route->setDefault('_controller', $class->getName().'::'.$method->getName()); } // requirements (@Method) foreach ($this->reader->getMethodAnnotations($method) as $configuration) { if ($configuration instanceof Method) { $route->setRequirement('_method', implode('|', $configuration->getMethods())); } } } /** * Makes the default route name more sane by removing common keywords. * * @param ReflectionClass $class A ReflectionClass instance * @param ReflectionMethod $method A ReflectionMethod instance * @return string */ protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method) { $routeName = parent::getDefaultRouteName($class, $method); return preg_replace(array( '/(bundle|controller)_/', '/action(_\d+)?$/', '/__/' ), array( '_', '\\1', '_' ), $routeName); } }