这是一个关于构建动态路由的例子。
基本上:
- 你为事件添加一个监听器
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);
无论如何,我仍然不明白你想如何制作它......即使在你最后一次编辑之后。