由于我的应用程序越来越大,我想将管理员前缀操作和视图与正常操作和视图分开。管理员的新文件夹是 Controller/admin/UsersController.php
。
我想更改我的 cakephp 控制器和视图文件夹结构以匹配我正在使用的前缀。
管理员前缀示例:
控制器:
app/Controller/UsersController.php (contain view(), index() ...)
app/Controller/admin/UsersController.php (contain admin_view(), admin_index() ...)
视图:
app/View/Users/index.ctp (for index() in UsersController.php)
app/View/Users/admin/index.ctp (for admin_index() in admin/UsersController.php)
如何使用 Cakephp 2.6 实现此结构?
与 3.x 中这是前缀的默认行为不同,2.x 不支持此功能。
您可以尝试使用自定义/扩展调度程序(以便检索所需的控制器)甚至调度程序过滤器来破解它,以防您冒险,并在您的应用程序控制器中修改相对于前缀的视图模板路径。
这应该可以做到,但是我可能会简单地使用插件代替,这将很好地分离事物,而无需任何额外的摆弄。
如果你只是想分离逻辑,你可以做这样的事情。这是未经测试的只是给你一个想法的想法。我将在代码之后解释这个概念:
public function beforeFilter() {
if ($this->request->prefix === 'foo') {
$name = Inflector::classify($this->request->prefix);
$className = $name . 'ChildController';
App::uses($className, 'Controller/Foo');
$this->ChildController = new $className($this);
}
}
public function __call($method, $args) {
if ($this->request->prefix === 'foo' && method_exists($this->ChildController, $method)) {
call_user_func_array([$this->ChildController, $method], $args);
}
}
根据前缀,您可以加载其他类。如何加载该类以及如何实例化它,传递给它的参数取决于您。在我的示例中,我直接传递控制器实例。我认为您实际上可以在此处初始化一个完整的控制器,但请注意,像会话这样的组件可能会导致问题,因为它们可能已经由"父"控制器启动。
当您现在调用不存在的控制器方法时,它将尝试在 ChildController 上使用相同的参数调用相同的方法。它不是一个好名字,但也许你可以想出更好的东西。
您还必须实现一些逻辑才能从类中的正确位置加载视图,但这应该不难,只需检查控制器类即可。
但实际上我没有看到你的问题,我开发过一个应用程序,它有 560 多个表,并且没有将代码放入子文件夹中不是问题,它实际上确实使用了类似的解决方案。
我认为你必须在你的控制器中编写很多代码,在你的模型中获取更多的代码,控制器应该不是问题。
另一种解决方案可能是考虑在 CakePHP 中实现一个服务层,该服务层在模型简化为数据处理程序的同时实现实际的业务逻辑。该服务将位于控制器和模型之间。我现在也这样做了几次,如果做得对,它的效果很好。