In meiner Symfony 3.2 App, erstelle ich einen benutzerdefinierten Router, der sich von Symfony\Bundle\FrameworkBundle\Routing\Router
erstreckt. Implementierung für configureRoute() von AnnotationClassLoader
Je nach Bedarf es implementiert eine getRouteCollection()
Methode:
public function getRouteCollection() {
$locator = new FileLocator(__DIR__ . '/../Controller');
$annotationReader = new Doctrine\Common\Annotations\AnnotationReader();
$classLoader = new AnnotationClassLoader($annotationReader);
$routeLoader = new Symfony\Component\Routing\Loader\AnnotationDirectoryLoader($locator, $classLoader);
$routes = $routeLoader->load('.\\', 'annotation');
return $routes;
}
Die AnnotationClassLoader
, die hier verwendet wird, ist meine eigene, erweitert sie die abstrakte Symfony\Component\Routing\Loader\AnnotationClassLoader
Klasse. Es implementiert nur eine Methode:
protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot) {
$route->setDefault('_controller', '???');
return $route;
}
Ich möchte diese verwenden, um die Standard-Controller für eine Route zu setzen, die in den Anmerkungen gefunden wurde. Die AnnotationReader
liest alle Routen aus dem Quellcode völlig in Ordnung, aber es setzt ihre Standard-Controller überhaupt nicht, was ich versuche, in configureRoute
zu tun. Diese Funktion scheint auf jeder gefundenen Route aufgerufen zu werden.
Das Problem ist jetzt, den passenden Ausdruck zu finden, um '???'
durch zu ersetzen. Am Ende brauche ich ein Ergebnis wie 'MyPluginBundle:ControllerName:actionName'
. Das bedeutet, dass ich entweder die Zeichenfolge mit den Informationen erstellen muss, die ich habe (die vier Argumente der Funktion sind), oder ich mache einen völlig falschen Ansatz und es gibt einen viel einfacheren Weg, dies zu tun.
Beispiel Dump $route
:
Wie Sie sehen können, gibt es keinen Standard für _controller
noch.
object(Symfony\Component\Routing\Route)
private 'path' => string '/my/route' (length=9)
private 'host' => string '' (length=0)
private 'schemes' =>
array (size=0)
empty
private 'methods' =>
array (size=0)
empty
private 'defaults' =>
array (size=0)
empty
private 'requirements' =>
array (size=0)
empty
private 'options' =>
array (size=1)
'compiler_class' => string 'Symfony\Component\Routing\RouteCompiler' (length=39)
private 'compiled' => null
private 'condition' => string '' (length=0)
Beispiel Dump $class
:
object(ReflectionClass)
public 'name' => string 'MyPluginBundle\Controller\DefaultController' (length=43)
Beispiel Dump $method
:
object(ReflectionMethod)[174]
public 'name' => string 'indexAction' (length=11)
public 'class' => string 'MyPluginBundle\Controller\DefaultController' (length=43)
Beispiel Dump $annot
:
MyPluginBundle\Controller\DefaultController::indexAction
Appanrently: bekommt
$route->setDefault('_controller', $method->class.'::'.$method->name);
Dieser Ausdruck Sie so etwas wie:
object(Sensio\Bundle\FrameworkExtraBundle\Configuration\Route)
protected 'service' => null
private 'path' (Symfony\Component\Routing\Annotation\Route) => string '/my/route' (length=9)
private 'name' (Symfony\Component\Routing\Annotation\Route) => string 'name_of_the_route' (length=17)
private 'requirements' (Symfony\Component\Routing\Annotation\Route) =>
array (size=0)
empty
private 'options' (Symfony\Component\Routing\Annotation\Route) =>
array (size=0)
empty
private 'defaults' (Symfony\Component\Routing\Annotation\Route) =>
array (size=0)
empty
private 'host' (Symfony\Component\Routing\Annotation\Route) => null
private 'methods' (Symfony\Component\Routing\Annotation\Route) =>
array (size=0)
empty
private 'schemes' (Symfony\Component\Routing\Annotation\Route) =>
array (size=0)
empty
private 'condition' (Symfony\Component\Routing\Annotation\Route) => null