我不知道在CakePHP中执行查询或在CakePHP中执行路由的第一件事,所以我甚至不知道如何开始为我的问题找到解决方案。也许你可以提供帮助。
我希望用户能够访问:
http://www.domain.com/movies/1
OR
http://www.domain.com/movie-nickname
两者都将访问“页面”控制器,“查看”操作。他们都应该提出页面id = 1。
(我不希望他们只是转到http://www.domain.com/pages/1)
每个网页都有一个昵称,但如果留空,则网址为http://www.domain.com/CATEGORY/PAGE,如第一个示例所示。
如果昵称没有留空,有没有办法可以在我的路线中查询“SELECT id FROM pages WHERE nickname ='nickname'”
除此之外,如果页面表中的昵称是“this that”,则URL应为http://www.domain.com/this-that,这意味着连字符需要用空格替换,然后执行查询。
我有第一个URL的路线:
Router::connect(
'/:category/:page',
array('controller' => 'pages', 'action' => 'view'),
array(
'pass' => array('page'),
'page' => '[0-9]+',
'category' => 'shows|music|games|books|hobbies'
)
);
我正在寻找第二种选择吗?
答案 0 :(得分:0)
虽然有可能,但您通常不会看到路由器执行此类逻辑。通常,路由器将此传递给控制器,控制器处理解析URL路径。
作为证明,请考虑本机编辑路由的工作原理。路由器不会测试数据库中是否存在现有的 id 。控制器确实。
答案 1 :(得分:0)
我想出了我的自定义路由。
App::uses('ClassRegistry', 'Utility');
// HOMEPAGE
Router::connect('/', array('controller' => 'index', 'action' => 'index'));
$requestURI = explode('/', $_SERVER['REQUEST_URI']);
$scriptName = explode('/',$_SERVER['SCRIPT_NAME']);
for($i= 0;$i < sizeof($scriptName);$i++)
{
if ($requestURI[$i] == $scriptName[$i])
{
unset($requestURI[$i]);
}
}
$param = array_values($requestURI);
$param1 = $param[0]; // domain.com/page-nickname
$param2 = $param[1]; // domain.com/category_id/page_id
// convert 'page-nickname' to 'page nickname' which is what it would be in db
$pagelink = str_replace('-', ' ', $param1);
// initiate Page mode;
$pagesModel = ClassRegistry::init('Page');
// check if there is a matching page in the db that has link column like 'page nickname'
$matchedpage = $pagesModel->find('first', array(
'conditions' => array('Page.link LIKE' => "$pagelink"), 'recursive' => '0'
));
// Cache::write('routepagelinks', $pagelinks);
// if there is a match
if($matchedpage['Page']['id']){
Router::connect('/' . $param1, array('controller' => 'pages', 'action' => 'view', 'page' => $matchedpage['Page']['id']), array(
'pass' => array('page'),
'page' => '[0-9]+'
));
// ... more custom routing if there is a match
}
// general routing info here
// if no page-nickname, routes page for domain.com/category_id/page_id
Router::connect(
'/:category/:page',
array('controller' => 'pages', 'action' => 'view'),
array(
'pass' => array('page'),
'page' => '[0-9]+',
'category' => 'shows|music|games|books|hobbies'
)
);