CakePHP最佳实践:管理员有或没有路由

时间:2010-07-15 22:00:29

标签: php cakephp authorization url-routing separation-of-concerns

我正在对我在CakePHP 1.2下构建的CakePHP应用程序进行大修。我已升级到1.3,正在考虑从我的应用程序的管理路由范例转移。我发现由于前端和管理员的重复功能,我的一些控制器变得非常大。我的直觉是,创建一组管理控制器并将管理路由放在一起更加清晰,但是我希望得到关于其他人正在做什么的信息以及我将错过的功能(如果有的话)放弃路由。

在这方面,强大的CakePHP应用程序(或其他MVC框架)的最佳实践是什么?

5 个答案:

答案 0 :(得分:1)

我建议将前端应用程序和管理员分成两个单独的应用程序(/app/admin)。只需将admin视为一个简单的前端应用程序,对数据库进行所有“脏”工作。

通过这样做,您将能够在URL中使用/ admin前缀访问您的管理员,或者将DocumentRoot设置为/ admin / webroot并使用子域(即admin.myapp.com)访问管理员。

为避免模型代码重复,您可以将模型放入某个共享文件夹(即/vendors/core/models)并将此路径添加到bootstrap.php文件中的模型路径(App::build('models' => array(VENDORS . 'core/models/')),用于CakePHP 1.3, CakePHP 1.2的$modelPaths = array(VENDORS . 'core/models/')

要为您的模型添加更多管理员或应用程序特定内容,您可以通过加载核心模型并扩展它来扩展/ models中的核心模型:

App::import('Model', 'CoreModelName');

class CustomCoreModelA extends CoreModelA
{
    function specificMethod() {}
}

这可以用于共享组件,行为等。

答案 1 :(得分:1)

我使用管理路由而不是构建应用程序,而不是版本总是一团糟。如果您的某些方法相同,则可以执行以下操作。

function add(){
$this->_add();
}

function admin_add(){
$this->_add();
}

function _add(){
... your code ...
}

我敢打赌,并非所有代码都是相同的,并且不使用管理员路由,最终会有大量代码执行if(... is admin ...) { echo 'blaa'} else { echo 'foo'; }

答案 2 :(得分:0)

如果管理路由不适合您的方案,请不要理会。我也没有使用它,管理路径不适合我的应用程序。复制代码完全是浪费精力。

您可以对细粒度角色使用ACL规则,或者只是在控制器的beforeFilter()或操作的第一行中检查角色(admin标志)。

我有一个组件函数checkRole(array()),在我的操作的第一行中调用。如果当前用户没有提供的角色,则会记录并终止请求。

答案 3 :(得分:0)

我第二次使用ACL /角色来实现真正的管理员资源,并且可能在生产中不使用管理路由。我有时会为低级别的管理员提供一个脚手架(这么少的额外代码)管理路由,只有我才能访问,但这在强大的生产应用程序中可能并不明智。

在评论后进行编辑:这不是最佳选择,但您可以在网址中整理出您想要的内容,并将其整理到文件夹中。我还没有测试过,但这就是想法:

在controllers文件夹中创建一个文件夹“admin”,对于用户admin,创建一个users_admin_controller.php控制器文件。它们会折叠文件夹结构,因此您仍然无法使用与根目录相同的名称,但仍可以将它们分隔到文件夹中。

默认情况下会执行/admin_users/add类型的情况,但可以使用第二部分进行调整,一些路由:

Router::connect('/admin/users/:action', array('controller'=>'admin_users'))

这必须为每个管理部分完成 - 不理想,但我无法在不修改Cake代码的情况下找到更好的方法。

答案 4 :(得分:0)

我已经为我的应用程序使用了ACL,并且发现它比使用管理路由更好。它更容易。如果你真的想要一个前缀,你可以通过正常的路由来做到这一点。