在CakePHP中路由除某些参数外的所有参数

在CakePHP中路由除某些参数外的所有参数,cakephp,routing,routes,Cakephp,Routing,Routes,我正试图在我的项目中设置一个路由定义,允许用户通过简单地使用用户名作为url中的唯一参数来访问配置文件,比如www.example.com/username,而不是www.example.com/user/view/username 我已经设置了一个全包路由,以转到一个检查用户是否存在的操作,这是配置文件中的最后一个路由,它可以工作,但它超越了cake所做的所有基本路由。这意味着我必须为每个我想提供访问权限的控制器定义一条路由,以确保我永远不会到达catchall。我的路线: Router::c

我正试图在我的项目中设置一个路由定义,允许用户通过简单地使用用户名作为url中的唯一参数来访问配置文件,比如
www.example.com/username
,而不是
www.example.com/user/view/username

我已经设置了一个全包路由,以转到一个检查用户是否存在的操作,这是配置文件中的最后一个路由,它可以工作,但它超越了cake所做的所有基本路由。这意味着我必须为每个我想提供访问权限的控制器定义一条路由,以确保我永远不会到达catchall。我的路线:

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
的基本蛋糕功能,但如果控制器不存在,它将进入到
用户/视图
页面的最后一个路由

我的问题是,对于我试图实现的目标,我这样做是否正确?如果我需要为我想要访问的每个控制器定义一个路由,我会的,但我必须认为有更好的方法来实现这一点


谢谢

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

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;
    }

}

您的解决方案几乎完全按照您编写的方式工作。非常感谢你。