2017-08-06 322 views
0

我使用Symfony 3.2.9創建了一個應用程序,並且我將做一個管理面板來管理應用程序。應用程序像CMS一樣工作,所以使用URL創建新頁面,如domain.com/pagename1和domain.com/pagename1/subpagelevel2等。問題是我想爲管理控制檯創建網址,而且網址應該如下所示:domain.com/admin,但管理面板也需要一些子網頁,例如domain.com/admin/manage或domain.com/admin/manage/編輯/ 1等。Symfony 3 - 不包括特定路徑(url)開始的路線

我創建DefaultController與路由,如:

/** 
* @Route("/", name="homepage") 
*/ 

和AdminController與路由,如:

/** 
* @Route("/admin", name="admin") 
*/ 

問題是,當我要動態地創建新的應用子網頁我需要創建路由像:

/** 
* @Route("/{page}") 
*/ 

但是這覆蓋我的管理員鍋el子頁面(例如, domain.com/admin/manage)。

是不是通過AdminController排除或覆蓋默認DefaultController的路徑?我想有可能從DefaultController創建所有的URL,除了開始像domain.com/admin等路徑。

回答

1

從機制的文檔中https://symfony.com/doc/current/routing.html可以使用requirements參數指定一個更加嚴格的匹配

我想是這樣的工作對子級:

DefaultController:

/** 
* @Route("/", name="homepage") 
*/ 

AdminController:

/** 
* @Route("/admin", name="admin") 
*/ 

其他控制器:

/** 
* we exclude page=admin from this controller 
* @Route("/{page}", requirements={"page": "^(?!admin).+"})) 
*/ 
1

路線進行搜索在他們列出的順序 - 所以就把最通用的在列表的末尾,它會找到並使用/管理前/ {PAGE}

例如,一個我最後的在應用程序/ conf目錄/ routing.yml中的底部路線是

# http://symfony.com/doc/current/routing/redirect_trailing_slash.html 
remove_trailing_slash: 
    path: /{url} 
    defaults: 
     _controller: AppBundle:Default:removeTrailingSlash 
    requirements: 
     url: .*/$ 
    methods: [GET] 
+0

感謝您的幫助。我修改的routing.yml文件,而現在的樣子: 'admin_show: 路徑:/管理/ {}塞默認 :{_controller:的appbundle:管理員:指數} page_show: 路徑:/ {}塞默認 : {_controller:AppBundle:Default:index}' 我得到「找不到路由...」,我的代碼中有什麼錯誤嗎? 也許我應該在控制器上方的@Route中改變一些東西? '/ ** \t * @Route(「/」,name =「cms」) \t * /' – mcgoo

+0

您只想使用@Route註釋,將.yml文件放在'resource:@ bundle-path/.../... Controller.php'中,以便路由系統使用它們。 –

0
最乾淨的

您的使用情況:

爲什麼不能簡單地創建一個單獨的包管理員和在AdminBundle路線中放置一個前綴?

建議不要僅依靠路由指令和/或路由中的REGEX來避免創建捆綁包。這是Bundle被認爲是的。

應用程序/配置/ routing.yml中

admin: 
    resource: "@AdminBundle/Controller/" 
    type:  annotation 
    prefix: /admin 

然後,AdminBundle下的所有控制器/線路將在/管理前綴工作。

例如,索引控制器/ DefaultController/WhatEverController裏面AdminBundle這條路線:

/** 
* @Route("/") 
*/ 
public function indexAction() 
{ 
    //My code 
} 

將匹配 「/ admin」 的而不是 「/」

和:

/** 
* @Route("/{page}") 
*/ 
public function indexAction() 
{ 
    //My code 
} 

威爾匹配「/ admin/{page}」而不是「/ {page}」