我試圖仿效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框架)。