我正在尝试模拟Route
Symfony 注释(文档)的行为,它扩展Symfony\Component\Routing\Annotation\Route
了添加service
属性:
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 框架)。