使用Regex的CakePHP用户名URL?

时间:2011-04-23 20:00:04

标签: regex cakephp routes friendly-url

我在这里发表评论:http://bakery.cakephp.org/articles/PHPdiddy/2006/10/06/custom-urls-from-the-site-root

那说:

  

改变最后一行。
  路由器::连接( '/ ',   数组('controller'=>'成员',   'action'=> '节目'));
  到
      路由器连接::( '(管理?|!项目|图片)(
的*)。',       array('controller'=>'members','action'=>'show'));

有些人能够让它上班......虽然我看起来不太合适,所以我尝试了以下内容,但仍然没有运气:

Router::connect('(?!/admin|/items|/images)(/.*)',
array('controller' => 'members','action' => 'show'));

在任何情况下,目标都是拥有像http://domainname/username这样的网址,映射到用户唯一ID。它适用于/ *,但我宁愿不使用该方法。想法?

更新解决方案: 我使用下面选择的答案并添加以下内容。这对其他人可能有帮助。

$misc = array(*your misc webroot, admin route items here...*);
$notList = array_merge(Configure::listObjects('plugin'),Configure::listObjects('controller'));
$notListLowerCase = array();
foreach ($notList as $key=>$item):
    $notListLowerCase[] = strtolower(preg_replace("/(.)([A-Z])/","\\1_\\2",$item));
endforeach;
$notList = array_merge($notList,$misc,$notListLowerCase);
$notList = implode('|', $notList);

Router::connect('/:username', 
        array(
            'controller'=>'users', 
            'action'=>'view'
        ),   
        array(
            'username' => '\b(?:(?!'.$notList.')\w)+\b'
        )
    );

2 个答案:

答案 0 :(得分:4)

你去吧。您需要将其捕获为参数,然后在正则表达式中引用它。用户名将在控制器操作中的$ this-> params ['username']中提供。

Router::connect('/:username', 
    array(
        'controller'=>'members', 
        'action'=>'show'
    ),   
    array(
        'username' => '\b(?:(?!admin|items|images)\w)+\b'
    )
);

答案 1 :(得分:-1)

$misc = array(*your misc webroot, admin route items here...*);
    $notList = array_merge(App::objects('plugin'),str_replace('Controller','',App::objects('controller')));
    $notListLowerCase = array();
    foreach ($notList as $key=>$item):
        $notListLowerCase[] = strtolower(preg_replace("/(.)([A-Z])/","\\1_\\2",$item));
    endforeach;
    $notList = array_merge($notList,$misc,$notListLowerCase);
    $notList = implode('|', $notList);
    Router::connect('/:username', array('controller' => 'members', 'action' => 'show'),array('pass'=>array('username'),'username'=>'\b(?:(?!'.$notList.')\w)+\b'));