0

我正在尝试在我的项目中设置一个路由定义,这将允许用户通过简单地使用他们的用户名作为 url 中的唯一参数来访问配置文件,就像www.example.com/usernamewww.example.com/user/view/username

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

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否则会进入页面。

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

谢谢

4

1 回答 1

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

}

希望对你有帮助..

于 2013-08-29T08:59:49.043 回答