【问题标题】:Database selection using route prefixing in cakephp 2.4?在 cakephp 2.4 中使用路由前缀选择数据库?
【发布时间】:2014-01-13 02:09:38
【问题描述】:

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

我发现并尝试遵循这个建议: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 前缀创建链接?

或者我完全不在了?

【问题讨论】:

    标签: cakephp


    【解决方案1】:

    据我了解,您正在寻找 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

    【讨论】:

    • 是的,做到了。谢谢!
    猜你喜欢
    • 2011-06-09
    • 2013-10-09
    • 2014-02-19
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多