2013-09-21 46 views
1

我試圖仿效Route Symfony的註釋(documentation),它擴展Symfony\Component\Routing\Annotation\Route加入service屬性的行爲:Symfony如何在@Route批註中內部設置服務名稱?

class Route extends BaseRoute 
{ 
    protected $service; 

    public function setService($service) 
    { 
     $this->service = $service; 
    } 

    // ... 
} 

它添加service屬性,以便將_controller參數設置爲servicename:method當控制器其實是一項服務。這是在AnnotatedRouteControllerLoader類完成:

protected function configureRoute(Route $route, \ReflectionClass $class, 
    \ReflectionMethod $method, $annot) 
{ 
    // ... 
    if ($classAnnot && $service = $classAnnot->getService()) { 
     $route->setDefault('_controller', $service.':'.$method->getName()); 
    } else { 
     // Not a service ... 
    } 

    // ... 
} 

我的問題是如何/在調用setService($service)

我試着來定義我的自定義MyCustomRoute註釋(上述service屬性),循環每個容器和呼叫setService($serviceId)中的「通知」,該控制器實際上是一個服務:

foreach ($container->getServiceIds() as $serviceId) { 
    if ($container->hasDefinition($serviceId)) { 
     $definition = $container->getDefinition($serviceId); 
     $reflector = new \ReflectionClass($definition->getClass()); 

     // If the service is a controller then flag it for the 
     // AnnotatedRouteControllerLoader 
     if ($annot = $reader->getClassAnnotation($reflector, 
      'My\CustomAnnotations\MyCustomRoute')) { 
      $annot->setServiceName($serviceId); 
     } 
    } 
} 

這裏$container是Symfony服務容器,$reader是主文標註閱讀器。

這不是工作,因爲註釋是AnnotatedRouteControllerLoader再次讀取,導致不同的實例,失去了service財產。

我單獨使用路由組件(沒有整個Symfony框架)。

回答

相關問題