管理员的 Cakephp 自定义文件夹结构


Cakephp custom folder structure for admin

由于我的应用程序越来越大,我想将管理员前缀操作和视图与正常操作和视图分开。管理员的新文件夹是 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 中实现一个服务层,该服务层在模型简化为数据处理程序的同时实现实际的业务逻辑。该服务将位于控制器和模型之间。我现在也这样做了几次,如果做得对,它的效果很好。