我正在对我在 CakePHP 1.2 下构建的 CakePHP 应用程序进行大修。我已经升级到 1.3 并且正在考虑从我的应用程序的管理路由范式中移除。我发现由于前端和管理员的重复功能,我的一些控制器变得非常大。我的直觉是,创建一组管理控制器并将管理路由全部删除会更简洁,但我想了解其他人在做什么以及我将错过的功能(如果有的话)丢弃路由。
在这方面,健壮的 CakePHP 应用程序(或其他 MVC 框架)的最佳实践是什么?
我正在对我在 CakePHP 1.2 下构建的 CakePHP 应用程序进行大修。我已经升级到 1.3 并且正在考虑从我的应用程序的管理路由范式中移除。我发现由于前端和管理员的重复功能,我的一些控制器变得非常大。我的直觉是,创建一组管理控制器并将管理路由全部删除会更简洁,但我想了解其他人在做什么以及我将错过的功能(如果有的话)丢弃路由。
在这方面,健壮的 CakePHP 应用程序(或其他 MVC 框架)的最佳实践是什么?
我建议将前端应用程序和管理员简单地分成两个单独的应用程序(/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,$modelPaths = array(VENDORS . 'core/models/')
对于 CakePHP 1.2)。
要为您的模型添加更多管理员或应用程序特定的内容,您可以在 /models 中扩展您的核心模型,方法是加载核心模型并对其进行扩展:
App::import('Model', 'CoreModelName');
class CustomCoreModelA extends CoreModelA
{
function specificMethod() {}
}
这可以用于共享组件、行为等。
我使用管理路由而不是使用管理路由构建了应用程序,并且非版本总是一团糟。如果您的某些方法相同,则可以执行以下操作。
function add(){
$this->_add();
}
function admin_add(){
$this->_add();
}
function _add(){
... your code ...
}
我敢打赌,您的所有代码都不是相同的,并且不使用管理路由,您最终会做很多代码if(... is admin ...) { echo 'blaa'} else { echo 'foo'; }
如果它不适合您的场景,请不要打扰管理员路由。我也没有使用它,管理路径不适合我的应用程序。复制代码完全是浪费精力。
您可以对细粒度的角色使用 ACL 规则,或者在控制器的 beforeFilter() 或操作的第一行中简单地检查角色(管理员标志)。
我有一个组件函数 checkRole(array()),它在我的操作的第一行中被调用。如果当前用户没有提供的角色,它会记录并终止请求。
我在我的应用程序中使用了 ACL,我发现它比使用管理员路由要好得多。它容易得多。如果你真的想要一个前缀,你可以通过普通路由来做到这一点。
我会第二次将 ACL/角色用于真正的管理内容,并且可能不会在生产中使用管理路由。有时我会为低级管理内容保留一个脚手架(所以额外代码最少)的管理路由,只有我可以访问,但这在强大的生产应用程序中可能不明智。
评论后编辑:这不是最佳选择,但您可以将在 URL 中看起来像您想要的东西放在一起,也可以组织到文件夹中。我还没有能够测试它,但这里的想法是:
在您的控制器文件夹中创建一个文件夹“admin”,并为用户管理员创建一个 users_admin_controller.php 控制器文件。它们折叠文件夹结构,因此您仍然不能与根目录具有相同的名称,但您仍然可以将它们分隔到一个文件夹中。
默认情况下,这将执行/admin_users/add
类型情况,但这可以通过第二部分进行调整,一些路由:
Router::connect('/admin/users/:action', array('controller'=>'admin_users'))
这必须为每个管理部分完成 - 不理想,但如果不修改 Cake 代码,我想不出更好的方法。