2014-01-11 21 views
0

我正在研究可能被不同細分市場使用的系統。每個都有自己獨立的數據庫,但都具有相同的功能。我想在我的路線中有一個前綴,以便我可以選擇數據庫。在cakephp 2.4中使用路由前綴進行數據庫選擇?

我發現並試圖遵循這個建議: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前綴在我的視圖內創建鏈接?

還是我完全沒有?

回答

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

+0

呀看,這做到了。謝謝! – Salsa