我将在我的Symfony 2应用程序中创建一个模块系统。每个模块都是一个包。
我不知道如何动态(在我的服务代码中)从文件中加载路由(例如 AcmeSomeModuleBundle / Resources / config / routing.yml )并使用一些前缀应用它们(或主持人)。就像在 app / config / routing.yml 中嵌入代码一样:
berg_applications:
resource: "@AcmeSomeModuleBundle/Resources/config/routing.yml"
host: foobar.com
任何解决方案?
答案 0 :(得分:3)
您需要自定义路由加载器IMO:http://symfony.com/doc/current/cookbook/routing/custom_route_loader.html
对于一个项目,我必须构建路由加载器,它通过CURL从远程URL获取路由来加载路由,并且它运行良好。
文档非常清晰,当您查看示例时,自己构建文档非常容易。基本上,关键是:
::load()
方法。如果您遇到任何具体问题,请不要犹豫,在评论中发表问题。基本上,您的RouteLoader会在其load
方法中接收“资源”,并且应该对其执行任何操作,以便将新的Route
添加到Router
。
答案 1 :(得分:0)
如果为每个模块执行真正的捆绑方法,那么完成尝试的最简单方法是使用带有基于属性的路由的JMS Security-Extra捆绑包。
到你的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);
}
只要我有一个Resources / views / ControllerName / recentList.html.twig文件,所有内容都会自动编织在一起。