管理员的 Cakephp 自定义文件夹结构
Cakephp custom folder structure for admin
由于我的应用程序越来越大,我想将管理员前缀操作和视图与普通操作和视图分开。 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 中不支持。
您可以尝试使用 custom/extended dispatcher (in order to retrieve the desired controller) or even dispatcher filters in case you are adventurous, and in your app controller modify the view template path 作为前缀。
应该可以,但是我可能会改用插件,这样可以很好地分离事物而无需任何额外的操作。
如果你只是想分离逻辑,你可以这样做。这是未经测试的想法,只是给你一个想法。我会在代码后面解释这个概念:
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);
}
}
根据前缀,您可以加载其他 classes。如何加载 class 以及如何实例化它,传递给它的参数由您决定。在我的示例中,我直接传递控制器实例。我认为您实际上可以在这里初始化一个完整的控制器,但请注意像 Session 这样的组件可能会导致问题,因为它们可能已经被 "parent" 控制器初始化。
当您现在调用不存在的控制器方法时,它将尝试在 ChildController 上调用具有相同参数的相同方法。不是一个很好的名字,但也许你可以想出更好的名字。
您还必须实施一些逻辑以从 classes 中的正确位置加载视图,但这应该不难,只需检查控制器 class。
但实际上我没有看到你的问题,我开发了一个超过 560 个表的应用程序并且不将代码放入子文件夹不是问题,它实际上使用了类似的解决方案。
我认为你的控制器中有很多代码,在你的模型中加入更多代码,控制器应该不是问题。
另一个解决方案可能是考虑在 CakePHP 中实现一个服务层,它实现实际的业务逻辑,同时将模型简化为数据处理程序。该服务将位于控制器和模型之间。我现在也这样做了几次,如果做得好,效果很好。
由于我的应用程序越来越大,我想将管理员前缀操作和视图与普通操作和视图分开。 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 中不支持。
您可以尝试使用 custom/extended dispatcher (in order to retrieve the desired controller) or even dispatcher filters in case you are adventurous, and in your app controller modify the view template path 作为前缀。
应该可以,但是我可能会改用插件,这样可以很好地分离事物而无需任何额外的操作。
如果你只是想分离逻辑,你可以这样做。这是未经测试的想法,只是给你一个想法。我会在代码后面解释这个概念:
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);
}
}
根据前缀,您可以加载其他 classes。如何加载 class 以及如何实例化它,传递给它的参数由您决定。在我的示例中,我直接传递控制器实例。我认为您实际上可以在这里初始化一个完整的控制器,但请注意像 Session 这样的组件可能会导致问题,因为它们可能已经被 "parent" 控制器初始化。
当您现在调用不存在的控制器方法时,它将尝试在 ChildController 上调用具有相同参数的相同方法。不是一个很好的名字,但也许你可以想出更好的名字。
您还必须实施一些逻辑以从 classes 中的正确位置加载视图,但这应该不难,只需检查控制器 class。
但实际上我没有看到你的问题,我开发了一个超过 560 个表的应用程序并且不将代码放入子文件夹不是问题,它实际上使用了类似的解决方案。
我认为你的控制器中有很多代码,在你的模型中加入更多代码,控制器应该不是问题。
另一个解决方案可能是考虑在 CakePHP 中实现一个服务层,它实现实际的业务逻辑,同时将模型简化为数据处理程序。该服务将位于控制器和模型之间。我现在也这样做了几次,如果做得好,效果很好。