2

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

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

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

有什么解决办法吗?

4

2 回答 2

3

您需要自定义路由加载器 IMO:http ://symfony.com/doc/current/cookbook/routing/custom_route_loader.html

对于一个项目,我必须构建路由加载器,它通过 CURL 从远程 URL 获取路由来加载路由,它运行良好。

文档非常清晰,当您查看示例时,自己构建一个非常容易。基本上,关键是:

  • 定义路由资源时的“类型”。您应该创建自定义类型,以便您的路由加载器识别它并将其用于处理。
  • ::load()方法。

如果您遇到任何具体问题,请不要犹豫,在评论中发表问题。基本上,您的 RouteLoader 将在它的方法中接收“资源”,load并且应该做它需要做的任何事情来添加新RouteRouter.

于 2013-10-28T20:19:21.240 回答
0

如果您为每个模块执行真正的捆绑方法,那么完成您尝试做的最简单的方法是使用带有基于属性的路由的 JMS Security-Extra 捆绑。

在您的 composer.json 文件中,添加以下内容: "require": { ... "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 文件,一切都会自动为我编织在一起。

于 2013-10-28T20:09:15.780 回答