我在PortfolioController中有以下代码:
function index()
{
$this->set('posts', $this->Portfolio->find('all'));
}
function view ( $id, $slug )
{
$post = $this->Portfolio->read(null, Tiny::reverseTiny($id));
$this->set(compact('post'));
}
但是,为了让视图从网址中删除/view/
,我已将以下内容添加到我的路由中:Router::connect('/portfolio/*', array('controller' => 'portfolio', 'action' => 'view'));
这会破坏索引方法,因为它会通过调用view方法来覆盖它,并显示一个空白视图
我该如何解决这个问题?
答案 0 :(得分:6)
你准备做什么? (还有什么是$ slug?)
听起来你想要做的就是删除动作(或者至少是view()动作?)从URL中显示,amirite?有点像默认的pages_controller display()方法 - 静态页面的catch-all操作?
我该如何解决这个问题?
好吧,我建议从打破这条路线开始,因为否则它正在按照你的说法去做:
Router::connect('/portfolio/*',
// * is a wildcard matching anything & everything after /portfolio/
array('controller' => 'portfolio',
// and routing to portfolio's view() action, with or w/o required $args to pass
'action' => 'view'));
所以你在调用index()时看到的不是空白视图,它是一个被抑制的致命错误,当index()重新路由到view()并且没有$ id传入时会发生这种情况第一个arg。
请注意结束DS。路线顺序很重要;抓住的第一条规则,胜利。如果省略了url的动作,则以下路径将默认映射到索引,但它们不相同。
// Targets inside the controller (its methods)
Router::connect('/portfolio/',
array('controller' => 'portfolio', 'action' => 'index'));
与
不同// Targets the controller
Router::connect('/portfolio',
// Specifies the default controller action, can be whatever
array('controller' => 'portfolio', 'action' => 'index'));
对于您要做的事情,它应该是
// Targets the controller
Router::connect('/portfolio',
// Routes to 'controller default method' which is index() by Cake default
array('controller' => 'portfolio');
只要URL中缺少操作,这就允许Cake强制自动默认映射到控制器的index()。
除了尾随DS和尾随星号之外,它仍然有用。应该捕获index()的相同规则重新路由到view(),这要归功于定位投资组合中所有操作的尾随星号。
因此,Foo的建议不起作用 - >尾随DS +通配符:
Router::connect('/portfolio/',
// the trailing DS changes it to target 'inside portfolio' instead of 'portfolio'
array('controller'=>'portfolio', 'action'=>'index'));
// trailing arbitrary wildcard maps any / all actions directly to view() method
Router::connect('/portfolio/*',
array('controller' => 'portfolio', 'action' => 'view'));
这只是确保投资组合中的所有操作直接映射到投资组合视图()方法(包括/ portfolio / index操作)。不要通过go等。任何组合操作都会解析为通配符,无论如何,将整个控制器别名化为该方法。因此,您可以将DS从第一条路线上剔除,但任何以/ portfolio开头的网址仍然会路由到view()。包括url / portfolio / index。
试试这个:
// catches portfolio/index() without index in the url
Router::connect('/portfolio',
array('controller' => 'portfolio'));
// maps to portfolio/view() without view in url, just /portfolio/integer id
Router::connect('/portfolio/:id',
array('action'=>'view', array('id' => '[0-9]+'));
// routes everything else in portfolio as usual
Router::connect('/portfolio/:action/*',
array('controller'=>'portfolio'));
路线可能很棘手。这是一些链接; HTH。 :)
http://bakery.cakephp.org/articles/Frank/2009/11/02/cakephp-s-routing-explained
答案 1 :(得分:0)
我自己是CakePHP的新手,但我相信你可以添加
Router::connect('/portfolio/', array('controller' => 'portfolio', 'action' => 'index'));
在与明星的路线之前。
答案 2 :(得分:0)
据我所知,是关注 你应该这样给:
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
我的意思是你应该更改控制器名称的别名。
Router::connect('/portfolios/*', array('controller' => 'portfolios', 'action' => 'view'));