使用cakephp 2.4中的路由前缀进行数据库选择?

时间:2014-01-11 18:44:40

标签: cakephp

我正在研究一个可能被不同细分市场使用的系统。每个都有自己独立的数据库,但都具有相同的功能。我想在我的路线中有一个前缀,所以我可以选择数据库。

我发现并尝试遵循此建议:CakePHP - select database config based on route or url?

所以使用上面的答案,我有这个设置:

route.php:

App::uses('SystemSelector', 'Routing/Route');

Router::connect('/:sys/*', array(), array('routeClass' => 'SystemSelector'));

Router::connect('/:sys',             array('controller' => 'users', 'action' => 'login'));
Router::connect('/:sys/users/logout', array('controller' => 'users', 'action' => 'logout'));
Router::connect('/:sys/users/add',    array('controller' => 'users', 'action' => 'add'));

Router::connect('/:sys/tickets/index', array('controller' => 'tickets', 'action' => 'index'));
Router::connect('/:sys/tickets/view', array('controller' => 'tickets', 'action' => 'view'));
Router::connect('/:sys/tickets/add', array('controller' => 'tickets', 'action' => 'add'));

SystemSelector.php:

class SystemSelector extends CakeRoute {
    // see http://book.cakephp.org/view/1634/Custom-Route-classes
    public function parse($url) {
        $params = parent::parse($url);
        if (empty($params)) {
           return false;
        }

        switch ($params['sys']) {
            case 'test':
                DbSelector::$ds = 'test';
                break;
            case 'example':
                DbSelector::$ds = 'example';
                break;            
            default:
                throw new Exception('Bad route');
        }

        return false;
    }
}

和我的AppModel.php:

class AppModel extends Model {
    public function __construct($id = false, $table = null, $ds = null) {
        $ds = DbSelector::$ds;
        parent::__construct($id, $table, $ds);
    }
}

我遇到的问题是我的appController.php上有:

public $components = array(
        'Session',
        'DebugKit.Toolbar',
        'Auth' => array(
            'authenticate' => array(
                'Form' => array(
                    'passwordHasher' => 'My64',
                    'fields' => array('username' => 'user_login',
                                      'password' => 'user_senha')
                )
            ),
            'loginAction'    => array('controller' => 'users',   'action' => 'login'),
            'loginRedirect'  => array('controller' => 'tickets', 'action' => 'index'),
            'logoutRedirect' => array('controller' => 'users',   'action' => 'login')
        )
    );

并且登录重定向将我带到example.com/tickets/index,我认为我应该这样做: example.com/:sys/tickets/index。

如何将:sys前缀传递给此loginRedirect选项? 另外,如何使用正确的:sys前缀在我的视图中创建链接?

还是我完全离开了?

1 个答案:

答案 0 :(得分:2)

据我所知,您正在寻找persist选项,它定义了在生成URL时应自动包含哪些参数。您也可以使用controlleraction

示例:

$options = array(
    'routeClass' => 'SystemSelector'
    'persist'    => array('sys')
);

Router::connect(
    '/:sys/',
    array('controller' => 'users', 'action' => 'login'),
    $options
);

Router::connect(
    '/:sys/:controller',
    array('action' => 'index'),
    $options
);

Router::connect(
    '/:sys/:controller/:action/*',
    array(),
    $options
);

对于所有匹配的路由,这应该自动包含生成URL时为sys参数传递的适当值。

另请参阅 http://book.cakephp.org/2.0/en/development/routing.html#Router::connect