在Symfony1.4中添加动态路由

时间:2013-01-25 10:22:39

标签: routes symfony-1.4

我想知道,如果可能的话,我是否可以根据某些参数动态添加/注册新路由。

我知道路线很像

newsdetail:
    url: /newsdetail/:id/:title
    class: sfDoctrineRoute
    options: { model: News, type object }
    param: { module: articles, action: articledetail }
    requirements: 
        id: \d+
        sf_method: [get]

但是现在,有没有办法让我在动作中添加或添加这种路线? 我的问题是模块和操作可能会根据站点实例而改变...

所以,我已经构建了一个可以执行某些操作的组件和两个不同的模块,假设module1和module2,两者都包含组件。 由于不同的原因,我无法在路由文件中注册所有这些路由。 现在,user1必须具有转到module1的路由,并且user2必须具有module2的路由。 所以,我想在一个动作中添加路线。 我希望我能更好地解释它

2 个答案:

答案 0 :(得分:1)

Here is an example about building dynamic route

基本上:

  • 您为活动routing.load_configuration
  • 添加了一个监听器
  • 此侦听器从数据库中检索路由并将它们添加到当前路由缓存

这是一个已清理的代码段:

<?php

class frontendConfiguration extends sfApplicationConfiguration
{
  public function configure()
  {
    $this->dispatcher->connect('routing.load_configuration', array($this, 'listenToRoutingLoadConfigurationEvent'));
  }

  public function listenToRoutingLoadConfigurationEvent(sfEvent $event)
  { 
    $routing    = $event->getSubject(); 
    $products   = Doctrine::getTable('Product')->findAll();

    foreach ($products as $product)
    {
      if (0 == strlen($product->route))
      {
        continue;
      }

      $name  = 'product_'.$product->id;
      $route = new sfRoute(
        $product->route,
        array('module' => 'browse', 'action' => 'catalog', 'product' => $product->id),
        array('product' => '\d+'),
        array('extra_parameters_as_query_string' => false)
      );

      $routing->prependRoute($name, $route);
    }
  }
}

修改

您可以使用上下文从操作中检索路由:

$this->getContext()->getRouting()

因此,如果要从操作添加路线,可以执行以下操作:

$route = new sfRoute(
  '/my-route',
  array('module' => 'browse', 'action' => 'catalog', 'product' => 456),
  array('product' => '\d+'),
  array('extra_parameters_as_query_string' => false)
);

$this->getContext()->getRouting()->prependRoute('my-route', $route);

无论如何,我仍然没有真的了解你想要怎么做...即使在你上次编辑之后。

答案 1 :(得分:0)

为什么您没有相同的路由并根据凭据更改内容?