在CakePHP中路由除特定参数之外的所有参数

时间:2013-08-29 06:59:23

标签: cakephp routing routes

我正在尝试在我的项目中设置路由定义,这将允许用户只需使用其用户名作为网址中的唯一参数即可访问配置文件,例如www.example.com/username而不是www.example.com/user/view/username }

我已经设置了一个catch all all路由来检查用户是否存在,作为配置文件中的最后一个路由,并且它可以工作,但是它超过了蛋糕所做的所有基本路由。这意味着我必须为每个想要提供访问权限的控制器定义路由,以确保我永远不会进入捕获。我的路线:

Router::connect('/events/edit/*', array('controller' => 'events', 'action' => 'edit'));
Router::connect('/events/view/*', array('controller' => 'events', 'action' => 'view'));
Router::connect('/events/add', array('controller' => 'events', 'action' => 'add'));
Router::connect('/events/*', array('controller' => 'events', 'action' => 'index'));
Router::connect('/*', array('controller' => 'users', 'action' => 'view'));

因此,这将允许我访问我的活动页面,但是任何其他页面都会被发送到第二个路由器。

我想要的是一个路由,如果控制器存在,它会执行/controller/action/param的基本蛋糕功能,但是它会进入到user/view页面的最后一个路径否则。

我的问题是,对于我想要完成的事情,我是以正确的方式做到这一点吗?如果我需要为我想要访问的每个控制器定义路由,我会,但我必须认为有更好的方法来实现这一点。

由于

1 个答案:

答案 0 :(得分:1)

根据我对你的问题的理解,我认为你可以这样做。

App::uses('UserRoute','Lib');
Router::connect('/:user_name', array('controller' => 'users', 'action' => 'view'),
array('routeClass'=>'UserRoute', 'pass' => array('user_name')));

并在app/lib中创建一个UserRoute.php这样的文件

<?php

App::uses('Lib', 'CakeRoute');

class UserRoute extends CakeRoute {

    function parse($url) {

        $params = parent::parse($url);

        if (empty($params)) {
            return false;
        }

        App::import('Model', 'User');
        $User = new User();
        $user_count = $User->find('count',array(
            'conditions' => array('User.username' => $params['user_name']),
            'recursive' => -1 
        ));

        if ($user_count) {
            return $params;
        }

        return false;
    }

}

希望这会对你有帮助..