由于我的应用程序越来越大,我想将管理前缀操作和视图与正常操作和视图分开。 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实现此结构?
答案 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中实现服务层,该服务层实现实际的业务逻辑,同时将模型简化为数据处理程序。该服务将位于控制器和模型之间。我现在已经完成了几次,如果做得好,它的效果非常好。