CakePHP中的可变前缀路由

时间:2012-07-13 03:25:37

标签: php cakephp routing

我在CakePHP中创建了一个应用程序,它要求我在一个CakePHP安装中运行“多个”应用程序。像我这样的 n 控制器对所有应用程序都表现相同,但它们只是在我调用数据库时有所不同 - 无论如何,我需要创建一个行为类似于此的路径:

/app1/controller/action/a/b/c
/app2/controller/action/a/b/c

(其中app1app2是可以更改为任何内容的字母数字字符串)

这将被路由到类似:

/controller/action/app1/a/b/c
(对于app2也是如此,等等)

路由路由也可能只是/controller/action/a/b/c,但我需要有一种方法来访问控制器内URL的app1 / app2部分(以便在控制器)。有没有办法在CakePHP中执行此操作?感谢。

稍微相关的问题:完成上述操作后,是否有办法设置“默认”应用名称(就像我尝试访问/controller/action/a/b/c时会自动路由它相当于键入/global/controller/action/a/b/c?)

谢谢!

有效:我想要的只是使用路由(或任何其他可以执行此操作的CakePHP'方法)来处理/foobar/controller/action/the/rest/controller/action/the/rest之类的网址并通过“foobar”到控制器,以某种方式。 “Foobar”是任何字母数字字符串。

2 个答案:

答案 0 :(得分:2)

app/Config/routes.php添加:

Router::connect( 
    '/:app/:controller/:action/*', 
    array(), 
    array( 'pass' => array( 'app' ))
);

这会将app的值作为控制器中操作的第一个参数传递。因此,在您的控制器中,您可以执行以下操作:

class FoosController Extends AppController {
    public function view_something($app, $a, $b, $c) { 
        // ...
    }
}

当您请求/myApp1/foos/view_something/1/2/3时,$app的值为'myApp1'$a的值将为1等。

要连接其他路线之前,您可以添加以下内容:

Router::connect(
    '/pages/:action/*',
    array( 'app' => 'global', 'controller' => 'pages' ),
    array( 'pass' => array( 'app' )) // to make app 1st arg in controller
);

答案 1 :(得分:1)

您应该使用Model attribute -> dbconfig动态更改数据库,而不是路由。此外,您还必须向该方法发送一些参数,通过该参数可以确定哪个数据库需要与您的应用程序连接。