我将在我的Symfony 2应用程序中创建一个模块系统。每个模块将是一个捆绑包。
我不知道如何动态(在我的服务代码中)从文件加载路由(例如。AcmeSomeModuleBundle/Resources/config/routing.yml)并使用一些前缀(或主机)应用它们。就像通过在app/config/routing.yml中嵌入下面的代码来完成的那样:
berg_applications:
resource: "@AcmeSomeModuleBundle/Resources/config/routing.yml"
host: foobar.com
有什么解决办法吗?
您需要自定义路由加载程序 IMO:http://symfony.com/doc/current/cookbook/routing/custom_route_loader.html
对于一个项目,我必须构建路由加载器,该加载器通过 CURL 从远程 URL 获取路由来加载路由,并且它运行良好。
文档非常清晰,当您查看示例时,自己构建一个文档非常容易。基本上,关键的事情是:
- 定义路由资源时的"类型"。您应该创建自定义类型,以便路由加载程序识别它并将其进行处理。
-
::load()
方法。
如果您有任何偶然发现的具体问题,请随时在评论中发布问题。基本上,您的 RouteLoader 将在其load
方法中接收"资源",并且应该做任何需要做的事情来向Router
添加新Route
。
如果您为每个模块执行真正的捆绑方法,那么完成尝试执行的操作的最简单方法是使用具有基于属性的路由的 JMS 安全性额外捆绑包。
到你的 composer.json 文件,添加以下内容: "要求":{ ... "JMS/security-extra-bundle": "1.5.*",
更新作曲家文件
php composer.phar update
然后在您的 BundleName/Resources/config/routing.yml 文件中执行以下操作:
some_name:
type: annotation
resource: "@SomeBundle/Controller"
最后,对于控制器中的每个操作,使用 @Route 属性对其进行修饰:
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Route;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Method;
/**
* @Route("/SomeBundle/SomeController")
*/
class SomeController extends Controller {
/**
* @Route("someAction", name="myAction")
* @Method("GET") OR
* @Method({"GET", "POST"})
*/
public function someAction() {
}
}
JMS 捆绑包中的其他一些属性也使事情变得非常好。例如,我经常在操作中使用 @Template 属性。这意味着我不再需要执行以下操作:
public function recentListAction() {
...
return $this->render(
'AcmeArticleBundle:Article:recentList.html.twig',
array('articles' => $articles)
);
}
我可以简单地做:
/**
* @Route("/Articles/List")
* @Template()
*/
public function recentListAction() {
...
return array('articles' => $articles);
}
只要我有一个资源/视图/控制器名称/最近列表.html.twig 文件,所有内容都会自动为我编织在一起。