【问题标题】:Cakephp custom folder structure for admin管理员的 Cakephp 自定义文件夹结构
【发布时间】:2015-05-13 06:00:53
【问题描述】:

由于我的应用程序越来越大,我想将管理员前缀操作和视图与正常操作和视图分开。管理员的新文件夹是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 实现这个结构?

【问题讨论】:

  • 你好。我将上下文移动到你问题的开头段落,让读者立即抓住你在问什么。我所做的次要格式和更正是为了确保进一步清晰。
  • @FélixGagnon-Grenier 是的,现在好多了,谢谢^^

标签: php cakephp routing namespaces cakephp-2.0


【解决方案1】:

与 3.x 中这是前缀的默认行为不同,这在 2.x 中不受支持。

您可以尝试使用自定义/扩展dispatcher(以检索所需的控制器)甚至dispatcher filters(如果您喜欢冒险)来破解它,并且in your app controller修改view template path相对于前缀。

应该这样做,但是我可能会简单地使用插件来代替,这样可以很好地分离事物而无需任何额外的摆弄。

【讨论】:

  • 我知道可以通过插件方法完成,但我认为这不是正确的方式。我将使用调度程序方法,非常感谢这个提示:)
【解决方案2】:

如果你只是想分离逻辑,你可以做这样的事情。它是未经测试的,只是想给你这个想法。我会在代码之后解释这个概念:

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);
    }
}

根据前缀,您可以加载其他类。如何加载该类以及如何实例化它,传递给它的参数取决于您。在我的示例中,我直接传递控制器实例。我认为您实际上可以在这里初始化一个完整的控制器,但请注意像 Session 这样的组件可能会导致问题,因为它们可能已经由“父”控制器启动。

当您现在调用不存在的控制器方法时,它将尝试在 ChildController 上使用相同的参数调用相同的方法。不是一个很好的名字,但也许你可以想出更好的名字。

您还必须实现一些逻辑以从类中的正确位置加载视图,但这应该不难,只需检查控制器类即可。

但实际上我没有看到您的问题,我已经开发了一个包含 560 多个表的应用程序,并且不将代码放入子文件夹不是问题,它实际上使用了类似的解决方案。

我认为您的控制器中必须有很多代码,将更多代码放入您的模型中,控制器应该不是问题。

另一个解决方案可能是考虑在 CakePHP 中实现一个服务层,它实现实际的业务逻辑,同时将模型简化为数据处理程序。该服务将位于控制器和模型之间。我现在也这样做了几次,如果做得对,效果会很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2014-06-08
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多