我一直在寻找路由组件的文档,明确它接受哪些类型的参数。
例如,我刚创建的应用程序的routing.yml中的type: annotations
让我想看看其他类型的内容,但是没有文档。我只能在本书中找到文档,并在组件中找到一些文档。
答案 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,它负责为一种配置找到合适的加载器。