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

时间:2015-03-11 12:34:33

标签: php cakephp routing namespaces cakephp-2.0

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

2 个答案:

答案 0 :(得分:0)

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

您可以尝试使用自定义/扩展dispatcher进行攻击(以便检索所需的控制器),甚至dispatcher filters以防冒险,in your app controller修改{ {3}}关于前缀。

应该这样做,但是我可能只是简单地使用插件,这样可以将事情分开,而不需要任何额外的摆弄。

答案 1 :(得分:0)

如果你只想分开逻辑,你可以做这样的事情。这是一个未经考验的,只是想到给你一个想法。我将在代码之后解释这个概念:

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中实现服务层,该服务层实现实际的业务逻辑,同时将模型简化为数据处理程序。该服务将位于控制器和模型之间。我现在已经完成了几次,如果做得好,它的效果非常好。