1

我正在尝试模拟RouteSymfony 注释(文档)的行为,它扩展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 框架)。

4

1 回答 1

0

Route类声明为服务,参考文档,可以通过控制器注入依赖,也可以通过“setter注入”。看看这里: http ://symfony.com/doc/current/book/service_container.html#optional-dependencies-setter-injection

因此,您可以将您的服务声明为:

my_custom.router:
    class:     "Acme\MyBundle\MyServices\MyRouter"
    calls:
        - [setService, ["@service_key"]]
于 2013-09-21T17:07:20.097 回答