Symfony 2动态加载路由

时间:2013-10-28 16:36:22

标签: php symfony

我将在我的Symfony 2应用程序中创建一个模块系统。每个模块都是一个包。

我不知道如何动态(在我的服务代码中)从文件中加载路由(例如 AcmeSomeModuleBundle / Resources / config / routing.yml )并使用一些前缀应用它们(或主持人)。就像在 app / config / routing.yml 中嵌入代码一样:

berg_applications:
    resource: "@AcmeSomeModuleBundle/Resources/config/routing.yml"
    host: foobar.com

任何解决方案?

2 个答案:

答案 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文件,所有内容都会自动编织在一起。