0

我不知道在 CakePHP 中进行查询或在 CakePHP 中进行路由的第一件事,所以我什至不知道如何开始为我的问题寻找解决方案。也许你可以帮忙。

我希望用户能够访问:

http://www.domain.com/movies/1

或者

http://www.domain.com/movie-nickname

两者都将访问“页面”控制器,“查看”操作。他们都应该提出页面 id = 1。

(我不希望他们只是去http://www.domain.com/pages/1

每个页面都有 URL 的昵称,但如果留空,则 URL 将为http://www.domain.com/CATEGORY/PAGE,如第一个示例所示。

如果昵称没有留空,有没有办法在我的路线中进行查询,上面写着“SELECT id FROM pages WHEREnickname = 'nickname'”

最重要的是,如果 pages 表中的昵称是“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'
    )
);

我正在寻找的第二种选择可能吗?

4

2 回答 2

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'
    )
);
于 2013-01-17T19:11:45.853 回答
0

虽然有可能,但您不会经常看到路由器执行这样的逻辑。更常见的是,路由器将其传递给控制器​​,控制器处理解析 URL 路径。

作为证明,请考虑本机编辑路由的工作方式。路由器不会测试数据库中现有的id。控制器会。

于 2012-11-20T15:22:31.313 回答