关于路由组件的Symfony2文档?

时间:2015-02-05 17:18:51

标签: symfony

我一直在寻找路由组件的文档,明确它接受哪些类型的参数。

例如,我刚创建的应用程序的routing.yml中的type: annotations让我想看看其他类型的内容,但是没有文档。我只能在本书中找到文档,并在组件中找到一些文档。

1 个答案:

答案 0 :(得分:3)

装载机类型

路由加载器的主要类型在the component's docs中描述。它提到了不少装载机:

您将在Symfony\Component\Routing\Loader namespace

中找到所有核心加载器

这一切都基于Config's component loaders,所以如果您还阅读了the Config component,那还值得。

每个加载器的supports()方法都会告诉您实际使用加载器的情况。例如,对于YamlFileLoader它:

public function supports($resource, $type = null)
{
    return is_string($resource) 
       && 'yml' === pathinfo($resource, PATHINFO_EXTENSION) 
       && (!$type || 'yaml' === $type);
}

您可以看到它查看资源的扩展名并输入。

自定义加载器

您可以通过实施Symfony\Component\Config\Loader\LoaderInterface来实现自己的加载器。

How to Create a custom Route Loader食谱中了解更多相关信息。它实际上解释了路由加载器的工作原理。看看一些第三方加载器,例如FOSRestBundle的加载器。

如何将它们连接在一起

查看Symfony标准版中生成的容器,了解完整堆栈框架如何将它们连接在一起。它看起来应该类似于:

/**
 * Gets the 'routing.loader' service.
 *
 * This service is shared.
 * This method always returns the same instance of the service.
 *
 * @return \Symfony\Bundle\FrameworkBundle\Routing\DelegatingLoader A Symfony\Bundle\FrameworkBundle\Routing\DelegatingLoader instance.
 */
protected function getRouting_LoaderService()
{
    $a = $this->get('file_locator');
    $b = $this->get('annotation_reader');

    $c = new \Sensio\Bundle\FrameworkExtraBundle\Routing\AnnotatedRouteControllerLoader($b);

    $d = new \Symfony\Component\Config\Loader\LoaderResolver();
    $d->addLoader(new \Symfony\Component\Routing\Loader\XmlFileLoader($a));
    $d->addLoader(new \Symfony\Component\Routing\Loader\YamlFileLoader($a));
    $d->addLoader(new \Symfony\Component\Routing\Loader\PhpFileLoader($a));
    $d->addLoader(new \Symfony\Component\Routing\Loader\AnnotationDirectoryLoader($a, $c));
    $d->addLoader(new \Symfony\Component\Routing\Loader\AnnotationFileLoader($a, $c));
    $d->addLoader($c);

    return $this->services['routing.loader'] = new \Symfony\Bundle\FrameworkBundle\Routing\DelegatingLoader($this->get('controller_name_converter'), $this->get('monolog.logger.router', ContainerInterface::NULL_ON_INVALID_REFERENCE), $d);
} 

这里的关键是LoaderResolver,它负责为一种配置找到合适的加载器。