Cakephp:将 AppController 抽象到另一个层次,可能吗?
Posted
技术标签:
【中文标题】Cakephp:将 AppController 抽象到另一个层次,可能吗?【英文标题】:Cakephp: Abstracting AppController another level, possible? 【发布时间】:2010-12-24 22:52:26 【问题描述】:我想知道是否有可能在 AppController 和我的应用的其他控制器之间添加另一个抽象控制器?
这样我的控制器,例如UsersController 扩展 SecureController SecureController 扩展了 AppController。
我还希望能够让其他控制器直接扩展 AppController: SomeNonSecureController 扩展了 AppController。
这是因为我当前的 AppController 在其 beforeFilter 中有各种 Auth 和 ACL 的东西,但我也有不需要这些安全性东西的控制器(在一切都需要安全性之前,没有添加新规范).. 但是因为很多控制器确实需要它,所以将代码复制粘贴到所有需要的控制器是没有意义的。
我正在考虑将所有 beforeFilter 安全性内容放入 SecureController - 这样任何需要安全性的控制器都可以简单地扩展它,而其他控制器则直接从 AppController 继承。
你将如何继续做这样的事情?
提前致谢, 肯。
【问题讨论】:
【参考方案1】:我也一直在尝试这个。用任何其他控制器扩展任何控制器似乎都相对简单。在 Cake 2.0 中,您只需使用 import()
语句(include() 做类似的事情)。
App::import('Controller', 'Security');
class SecureAreaController extends SecurityController
// extra functionality *not* in base class goes here
【讨论】:
其实...我认为App::uses('SecurityController', 'Controller')
实际上是正确的做法(至少 Cake 在他们的库中是如何做到的)。不过不确定有什么区别。
另外,我最近的实验似乎表明这种继承结构工作得相当好,除了 $helpers
、$components
等实际上被覆盖的类变量在子类中而不是合并,因为 Cake 倾向于使用 AppController。您可以更改$_mergeParent
,但最好的选择是更改您的父类(AppController 的子类)以在__construct()
中添加/合并助手和组件。【参考方案2】:
我的第一个想法是看看我是否可以将 beforeFilter 中的一些功能抽象到一个组件中——记住组件也可以使用其他组件,只需将它们包含在组件的 $components 属性中,这样你就可以访问 AuthComponent 和AclComponent 等
如果这不合适,那么我会选择你的路线,为了做到这一点,只需 include('secure_controller.php');在您的文件中的个人控制器类声明之前。
我通过创建一个我在所有项目中使用的 BaseController 做了类似的事情,它提供了我所有的标准管理 CRUD 操作。然后我让我的 AppController 扩展它,它包含特定于应用程序的控制器范围的功能,然后单个控制器扩展它,最终实际上是空的。我所做的就是:
// app/base_controller.php
<?php class BaseController extends Controller ?>
// app/app_controller.php
<?php
include('base_controller.php');
class AppController extends BaseController
?>
// app/controllers/my_controller.php
<?php class MyController extends AppController ?>
【讨论】:
这是我的问题,我需要构建一个有 2 个 webroot 的应用程序:一个 /admin 和一个 /pro 但它们需要为模型等共享相同的 /app 文件夹。现在 /admin 下的所有内容都需要使用 Auth 和 ACL 确保安全,而 /pro 则不需要(可能需要几个控制器)。你会如何建议这样做?顺便说一句,我是来自您的 ACL 博客文章的 cmets 的 Ken :) 感谢您的回复! 嗯,我可能会升级到 1.3,然后使用 Routing.prefixes 来处理不同的 URL 前缀,并坚持对所有区域使用相同的模型和控制器。然后使用 AuthComponent::allowedActions 属性来切换需要授权的操作。还是我错过了重点? 嗯,这可能有效(对 Routing.prefixes 真的一无所知) - 但 1.3 仍处于 alpha 阶段,这是一个用于生产用途的应用程序,所以我不能冒险。需要找到1.2.5的解决方案:-\以上是关于Cakephp:将 AppController 抽象到另一个层次,可能吗?的主要内容,如果未能解决你的问题,请参考以下文章