5

我正在CakePHP 1.2下构建的CakePHP应用程序的大修工作。我已升级到1.3,正在考虑从我的应用程序的管理路由范例中移开。我发现我的一些控制器因为前端和管理员的重复功能而变得非常大。我的直觉是,创建一组管理员控制器并将管理路由放在一起会更清洁,但我想获得关于其他人正在做什么以及我将错过的功能(如果有的话)的输入丢弃路由。CakePHP最佳实践:有或没有路由的管理员

对于强大的CakePHP应用程序(或其他MVC框架)在这方面被认为是最佳实践?

+0

我已经得到了两个建议删除该路由,我倾向于这样做,但只要我开始尝试这一点,我觉得我撞到了一堵砖墙。在一个非框架化的应用程序中,我只需创建一个新的目录“admin”,并将所有管理员特定的控制器放在那里,其中许多与前端控制器具有相同的名称,因此将被访问:“/ admin /用户/添加”。我没有找到任何方式与Cake做类似的事情。我唯一的选择是/ admin_users/add吗? – seth 2010-07-17 20:44:23

回答

0

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

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

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

0

我第二次使用ACL /角色的真正管理员的东西,并可能不使用生产中的管理路由。我有时会为低级管理员保留一个脚手架(这么简单的额外代码)管理路由,只有我才能访问,但这在强大的生产应用中可能不明智。

评论后编辑:这不是最佳选择,但您可以将某些东西显示为您想要的URL,并将其组织到文件夹中。我还没有能够测试它,但这里的想法是:

在您的控制器文件夹中创建一个文件夹“admin”,并为用户admin创建一个users_admin_controller.php控制器文件。他们折叠了文件夹结构,因此您仍然不能拥有与您的根目录相同的名称,但仍可以将它们分隔到一个文件夹中。

默认将做一个/admin_users/add类型的情况,但可以与第二部分进行调整,一些路由:

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

这必须完成每个行政处 - 不理想,但我如果不修改Cake代码,无法找到更好的方法。

+0

那么你的管理部分的网址是什么样的?我觉得这样做会是一件容易的事情,除非没有好的方法将控制器放在通过/ subdir/control/action(例如/ admin/users/add)访问的子目录中。你是否只用前缀“admin”命名了所有的管理员控制器(例如/ admin_users/add)? – seth 2010-07-17 07:40:00

+0

如果使用ACL /角色,那么只有管理员才能访问的页面/操作,或者具有管理员的额外功能。 但我想你问的是使用脚手架时,或与管理部分。在那里,你可以使用“管理路由”让管理员/用户/添加像你想要的。请参阅CakePHP手册: http://book.cakephp.org/view/46/Routes-Configuration#Prefix-Routing-544 因此,您只需在用户控制器中具有“admin_add”功能,该功能可通过'/ admin/users/add',然后是一个通过'/ users/add'访问的普通'add'函数。 – cincodenada 2010-07-19 07:50:39

+0

我完全理解(并已实施)ACL /角色,我不使用脚手架。我只是有很多前端/管理部分控制器是相同的。我想把管理员控制器放在一个子目录“/ admin”中,并且网址看起来像“/ admin”而不使用前缀。 – seth 2010-07-19 16:53:26

0

我对我的应用程序使用了ACL,我发现它比使用管理路由好得多。它更容易。如果你真的想要一个前缀,你可以用普通路由来完成。

+0

我结束了使用ACL +前缀(实际上并不是真正改变了我原来的实现)。我仍然很讨厌蛋糕如何处理目录结构和文件名以及链接。如果一个控制器位于“admin”目录下,这将成为url路径的一部分。 – seth 2010-08-06 17:31:17

1

我会建议简单地将前端应用程序和管理员分成两个独立的应用程序(/app/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)路径建模。

为了更管理员或应用具体的东西添加到您的模型,你可以在/模型扩展自己的核心车型,通过加载内核模式和扩展它:

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

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

这可能对共享组件进行,行为等

+1

关于使用两个应用程序,我会同意,而且我已经尽管。但是你将模型放入供应商是一件丑陋的事情。而是在一个应用程序中使用APP :: build指向另一个应用程序中的模型文件。这在插件方面尤其存在问题。看这么多的展览非常慢。 – dogmatic69 2010-10-14 11:37:47

+0

说得对,将共享模型放在/ vendors目录中很丑陋,使用其他应用程序模型dir来查找模型听起来更好。唯一的问题是缺少名称空间,这样你就不得不在你的所有管理模型前缀。性能如何?那么,你必须选择是否有干净和可维护的架构或闪电般的应用程序,但有很多架构缺陷。 – ljank 2010-10-15 08:42:45

1

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

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

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

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

我打赌它不是所有的代码是一样的,而不是使用管理路由你最终会用大量的代码做if(... is admin ...) { echo 'blaa'} else { echo 'foo'; }