2017-05-16 2 views
0

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:

0 , Das Format

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 

Antwort

0

Ok, die wirklich einfache Lösung (die ich durch Versuch und Irrtum gefunden) ist MyPluginBundle:Default:index ist nur eine Abkürzung und nicht erforderlich.

Aber das lässt immer noch die Frage offen: Gibt es eine einfachere (z. B. integrierte) Möglichkeit, dies zu erreichen?

Verwandte Themen