我正在研究一个可能被不同细分市场使用的系统。每个都有自己独立的数据库,但都具有相同的功能。我想在我的路线中有一个前缀,所以我可以选择数据库。
我发现并尝试遵循此建议: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前缀在我的视图中创建链接?
还是我完全离开了?
答案 0 :(得分:2)
据我所知,您正在寻找persist
选项,它定义了在生成URL时应自动包含哪些参数。您也可以使用controller
和action
。
示例:
$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