0

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

我知道路线有点像

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 的路线。所以,我想在动作中添加路线。我希望我解释得更好

4

2 回答 2

1

这是一个关于构建动态路由的例子

基本上:

  • 你为事件添加一个监听器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);

无论如何,我仍然不明白你想如何制作它......即使在你最后一次编辑之后。

于 2013-01-25T10:39:38.980 回答
0

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

于 2013-01-28T17:11:21.010 回答