2010-02-12 46 views
0

我需要完成的是具有单个数据库但具有多个用户的多个帐户(公司)的单个应用程序。通过URL在一个CakePHP应用程序中处理多个帐户和用户domain.com/account/controller/action

的URL约定必须如下:domain.com/account/controller/action

因此,所有的控制器是由该公司/帐户名前缀。

所有帐户将共享单个数据库,但每个帐户都需要能够限制对其数据的访问。

问题是,我该如何实现?我想过实现某种类型的htaccess重写,其中我删除了第一个URL参数(account),并将其作为查询字符串参数传递,这会在app_controller内部解析。然而,挑战在于保持整个应用程序中的所有链接的完整性。即蛋糕路由将以某种方式需要知道帐户参数并将其传递给所有输出链接。

有没有人以前做过类似的事情?

回答

0

你可以做两件事情,包括路由。

首先,设置在线路的变量:

Router::connect('/:user/blog/*', array('controller' => 'blogs', 'action' => 'index')); 

现在你可以用$this->params['user']访问用户变量。与此相关的是,你将不得不手动设置你想要管理的每个控制器和动作。我认为这没什么大不了的,因为大多数情况下最好重写CakePHP的默认路由体系结构。

其次,你可以告诉你正在等待一个变量,并且可以在你的函数中作为参数访问。

Router::connect('/(.*)/*', array('controller' => 'blogs', 'action' => 'index')); 

在你的控制器:

function index($a, $b){ 
    pr($a); 
    pr($b); 
} 

而现在你会得到两个瓦尔。

我不知道它是否可以自动生成,也许重写htaccess可能是一个好主意。

希望它有帮助。

0

这是完全可能的(但我从来没有这样做过)。

我假设你使用标准的CakePHP认证方案。如果是这样,关于当前登录用户的信息可以在Auth-> User数组中找到。

Cake期望您在数据库中拥有用户表。您应该改变模型以与用户表建立belongsTo关系(即所有表都有一个user_id字段)。

在您的模型中,您可能可以使用afterFind()挂钩来检查user_id字段是否与当前登录的用户匹配,如果不是这种情况,则返回false。在您的控制器中,您应该检查所有模型操作是否有误。

.htaccess的想法可能不是很好。您应该将授权尽可能靠近数据源,放在模型中的蛋糕中(您可以将afterFind回调放入AppModel类中)。

扩展您的示例:

用户请求/ someController/someAction。

someAction: 

if($this->someModel->someOperation(someArgument)) { 

    //OK, show view 

} else { 

    // Something went wrong 
    // Your afterFind method provides a clue via the model->failure attribute 

    $this->flash($this->someModel->failure); 

} 
相关问题