2012-07-12 60 views
1

我使用的是PagesController(不一樣的是蛋糕已建成)僅使用過的路線,我想連接的新路線:CakePHP的創建如果所有其他途徑失敗

Router::connect('/*', array('controller' => 'pages', 'action' => 'view')); 

我真的想蛋糕如果所有其他(默認)路由都失敗,請僅使用此路由。然而,我似乎無法讓它與路線一起工作。我有一個預感,我需要使用一個自定義的CakeRoute類,但我完全不知道如何讓它做我想做的事情。

請問有人可以幫助我嗎?

[編輯]哦,它可能是知道我使用CakePHP 2.2.0

[第二編輯]根據要求,多一點信息是有用的。 我的路由器目前看起來是這樣的:

Router::connect('/', array('controller' => 'pages', 'action' => 'index')); 
CakePlugin::routes(); 
require CAKE . 'Config' . DS . 'routes.php'; 
Router::connect('/*', array('controller' => 'pages', 'action' => 'view')); 

當我去到/ home /約我得到「錯誤:HomeController中找不到」 我也試過這樣:

Router::connect('/', array('controller' => 'pages', 'action' => 'index')); 
CakePlugin::routes(); 
Router::connect('/*', array('controller' => 'pages', 'action' => 'view')); 
require CAKE . 'Config' . DS . 'routes.php'; 

但後來一切都發送到我的網頁控制器和我不希望出現這種情況。如果所有其他路線都失敗,我只希望使用該路線。

同樣,我有一個預感,這隻能使用自定義的CakeRoute類來完成,但我不知道具體如何。

+0

嗯,只是爲了檢查......是路由在routes.php文件中的最後一個路由?訂單是非常重要的 – pleasedontbelong 2012-07-13 08:18:18

+0

是的,我也試過,但它永遠不會被使用全部。如果另一條路線找不到匹配的控制器/操作,那麼它只是給我一個錯誤頁面,而不是嘗試我的後備路線。 – Evert 2012-07-13 09:45:49

+0

你可以發佈你的routes.php和url失敗的例子嗎? – pleasedontbelong 2012-07-13 10:13:07

回答

1

嘗試將您的一般路線放在末尾但在CakePlugin::routes();一行之前。事情是這樣的:

Router::connect('/', array('controller' => 'pages', 'action' => 'index')); 
//all your routes 
Router::connect('/*', array('controller' => 'pages', 'action' => 'view')); 

CakePlugin::routes(); 
require CAKE . 'Config' . DS . 'routes.php'; 

希望這有助於

編輯: 我有同樣的原則網站..我在結束時使用這條路線

Router::connect('/:slug', array('controller' => 'users', 'action' => 'view'),array('pass'=>array('slug'),'slug'=>"[a-z0-9\-]+")); 

CakePlugin::routes()前)它對我的工作很好。

+0

我已經嘗試過,但一切都路由到我的網頁/視圖,而我只想要路由到我的網頁/查看 – Evert 2012-07-13 18:19:51

+0

路由的URL可能問題是'*'...你有沒有嘗試傳遞一個變量?我編輯我的答案與我的一個網站的例子 – pleasedontbelong 2012-07-13 21:39:39

+0

對於我只適用於只有一個單詞的網址。當我做/家庭它的作品,但當我嘗試獲得一個子頁面,例如/ home/about那麼它不再工作。 – Evert 2012-07-13 22:06:32

1

我知道這是舊的文章,但對於任何擁有包羅萬象的蛋糕路由掙扎,這裏的瘦:

當您創建一個包羅萬象的途徑,如/ *那麼你就允許該定義來抓取URL中的所有內容。換句話說,它非常貪婪。據我所知,沒有辦法有條件地啓用這種定義。這意味着如果URL在定義/ *之前與任何路由定義不匹配,那麼/ *定義將會選擇它。因此,總是定義最後的所有路線,當然我們已經知道:-)

現在,爲了確保Cake繼續「正常」運行 - 意味着像/ posts/view/4這樣的URL將路由到PostsController :: view($ id = 4) - 您實際上需要在/ *定義之前在路徑文件中明確定義它。是的,如果你在Cake中使用catch-all路由,你需要明確地定義每個Controller :: method()路由,以利用標準的Cake路由約定。

雖然這聽起來令人望而生畏,但如果您在routes.php中將所有路由定義爲字母順序,那並沒有那麼糟糕。只需查看您的項目/ Controller目錄並按照相同的順序列出它們即可。我還在每個控制器組上面實施註釋,因爲有些需要多個路由定義。下面是我的routes.php文件一個文件提取的例子:

/** 
* CaseStudiesController 
*/ 
Router::connect('/case-studies', array('controller' => 'case_studies', 'action' => 'index')); 
Router::connect('/case-studies/:action', array('controller' => 'case_studies')); 
Router::connect('/case-studies/:action/*', array('controller' => 'case_studies')); 
Router::connect('/case-studies/*', array('controller' => 'case_studies', 'action' => 'index')); 

/** 
* PostsController 
*/ 
Router::connect('/posts', array('controller' => 'posts', 'action' => 'index')); 
Router::connect('/posts/:action', array('controller' => 'posts')); 
Router::connect('/posts/:action/*', array('controller' => 'posts')); 
Router::connect('/posts/*', array('controller' => 'posts', 'action' => 'index')); 

一般來說,你只需要每個控制器4個路由定義。最後,這是我的情況下routes.php的底部結尾:

/** 
* UrlAliasesController 
* 
* This catch-all route is very greedy and even grabs the default CakePHP /:controller/:action URL format 
* Above this line, all public controller methods must be accounted for in specific routes 
*/ 
Router::connect('/*', array('controller' => 'url_aliases', 'action' => 'check', 'admin' => false)); 

/** 
* Load all plugin routes. See the CakePlugin documentation on 
* how to customize the loading of plugin routes. 
*/ 
CakePlugin::routes(); 

/** 
* Load the CakePHP default routes. Only remove this if you do not want to use 
* the built-in default routes. 
*/ 
require CAKE . 'Config' . DS . 'routes.php'; 
相關問題