2017-06-01 50 views
1

我使用Symfony的CMF路由包來創建動態路由(我用一個例子在這裏):Symfony的重定向到動態路由名稱

$route = new Route('/dynamic-url'); 
$route->setMethods("GET"); 
$route->setDefault('_controller', 'AppBundle:MyRoute:getResponse'); 

$routeCollection->add('my-dynamic-route', $route); 

響應從getResponseAction加載()函數中MyRouteController:

/** 
* No annotations here, because I want the url to be dynamic from the database 
*/ 
public function getResponseAction(Request $request) { 

    return $this->render('dynamic-page-template.html.twig'); 

} 

當我去'/動態網址',它的作品。

當另一個控制器,我想重定向到這個充滿活力的路線,像這樣:

return $this->redirectToRoute('my-dynamic-route'); 

但我得到這個錯誤:「鏈接的路由器中沒有一個能夠產生路線:路線「我-dynamic-route'not found「

另一個有趣的事情是:當我進入'/ dynamic-url'時,dev欄實際上表示路由名是'my-dynamic-route'。

編輯

當我加載所有的路線,我沒有看到我的動態路由名稱:

$this->get('router')->getRouteCollection(); 

我認爲他們應該在列表中。

回答

1

由於它是一個動態路由,它不會被保存在任何地方(如routing.yml),它只會在Request被定義的地方使用。因此,在請求您的應用程序結束時立即「忘記」關於在運行時生成的新路線。

When I load all the routes, I don't see my dynamic route names: $this->get('router')->getRouteCollection(); I think they should be in this list.

Actualy號這取決於你在哪裏打電話$this->get('router')->getRouteCollection(); 只是嘗試調用

dump($this->get('router')->getRouteCollection();) 

在你的行動return語句,你要添加的my-dynamic-route路線之前。我相信你會在路線列表中看到你的my-dynamic-route,但是如果你在其他地方叫它 - 你不會看到它。

它不太瞭解一點symfony而有關Web的無狀態(見Why say that HTTP is a stateless protocol?

+0

Thnx!動態路由確實「被遺忘」,而靜態路由被保存。我切換到使用'LoaderInterface',所以路線被保存。我使用這個教程http://mmoreram.com/blog/2013/10/01/dynamic-routes-in-symfony2/ – BigJ

0

我開始思考這個問題,並指出你的問題的routing issue上的symfony-CMF。你用#symfony-cmf標記,我認爲這對我們來說是重要的特性。

我也覺得,當你與/my-route堅持你的路線,你也應該問的路由器該名稱(或者在CMF的情況下與該路線的內容對象。)

0

如果使用CmfRoutingBundle動態路由器,你應該堅持你的路線原則。這裏的動態思想是它們可以在運行時創建,例如,在管理界面或其他地方通過代碼。 DynamicRouter從數據庫加載路由。

如果使用PHPCR-ODM,路由名稱是存儲庫ID,通常類似/cms/routes/my-routeyou can generate it with that name。如果您有權訪問從數據庫加載的路由對象,則也可以從中生成路徑對象,而不是路徑。如果您必須在應用程序中對路徑進行硬編碼,則表明可能是正常配置的路線會更好。

如果您只是將動態路由添加到路由集合中,則必須確保在每個請求中都會發生這種情況,只有當您添加它時纔可以使用該路由。通過CMF ChainRouter,你可以註冊自己的路由器,但我不知道這是一個很好的用例。要麼你知道路由,那麼你可以在routing.xml | yml | php配置文件中配置它。或者路線是動態加載的,在這一點上,您應該使用DynamicRouter,可能使用custom route loader