是否可以定义多个子类前缀。现在,前缀按以下格式编写。
$config['subclass_prefix'] = "MY";
在这里,我可以创建自定义控制器 MY_Controller ,后面附加前缀“MY”。
这里我想创建另一个名为 MY_AdminController 的自定义控制器以及MY_Controller。在这种情况下如何定义子类前缀。
答案 0 :(得分:1)
为时已晚,但对我来说正确的答案是将CI_controller或MY_controller类扩展到同一个文件中..(对不起我的英文)
application/core/MY_controller.php
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class MY_Controller extends CI_Controller {
...
...
...
}
class Admin_Controller extends CI_Controller{
...
do what you need
...
}
?>
我在另一篇文章中看到了这个答案(不记得了),我解决了我的问题
答案 1 :(得分:1)
我有一些技巧。我在loading-cores
上设置了新配置“config.php
”。您可以随意设置配置名称。
$config['loading-cores'] = array(
"load-my-cores" => TRUE,
/* core class(es) to be loaded, note: must be a php file type */
"my-cores" => ["APIResponder", "Anotherclass"]
);
我在核心文件夹中的课程:
- APIResponder.php
- Anotherclass.php
然后打开文件..system/core/CodeIgniter.php
,尝试找到此代码段:
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')){
require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';}
在下方添加代码行以加载核心类,将其放在上面的代码段之后:
if(isset($CFG->config['loading-cores'])){
if($CFG->config['loading-cores']['load-my-cores'] && count($CFG->config['loading-cores']['my-cores']) > 0){
foreach ($$CFG->config['loading-cores']['my-cores'] as $core) {
if (file_exists(APPPATH."core/{$core}.php")){
require_once APPPATH."core/{$core}.php";
}
}
}
}
如果您不需要加载核心类,请设置"load-my-cores" => FALSE
。
答案 2 :(得分:0)
您只能有一个前缀。
您尝试做的事情听起来像是扩展,您希望扩展现有的控制器以执行其他操作。
不要忘记控制器不仅仅是一个抽象元素,它是您正在使用的MVC框架的一部分。
'base'控制器不应该是特定的(例如,adminController),它应该尽可能通用并做'控制器'的东西(加载视图,加载所有模型等)。
假设您有一个用户控制器,一个管理员是一种用户,因此它应该扩展用户模型。这可以防止您将代码加倍,因为管理员至少应该做一些用户正在做的事情。只是一个例子。
答案 3 :(得分:0)
简答:并非没有调整核心
答案很长:您可以通过在/system/core/CodeIgniter.php
中添加一个钩子来解决问题,这会在加载任何其他控制器之前加载新控制器。这是我如何做到的:
(请注意,我使用MY_Controller作为管理控制器,MY_Basecontroller作为常规控制器):
第一步 - 您将此行添加到/system/core/CodeIgniter.php, line 241
- see exactly where:
$EXT->_call_hook('pre_local_controller');
您必须在加载本地控制器之前执行,否则它将无法正常工作。
第二步 - 将以下代码添加到/application/config/hooks.php
:
$hook['pre_local_controller'][] = array(
'class' => 'Hooks',
'function' => 'loadCore',
'filename' => 'Hooks.php',
'filepath' => 'hooks',
'params' => 'MY_Basecontroller.php'
);
第三步 - 创建一个文件/application/hooks/Hooks.php
并将以下代码放入其中:
class Hooks
{
public function loadCore($class)
{
require_once(APPPATH . 'core/' . $class);
}
}
第四步 - 利润
现在,您的课程可以从位于MY_Basecontroller
的班级/application/core/MY_Basecontroller.php
延伸。显然,不要忘记它应该扩展CI_Controller
它仍然不完全是'多子类前缀' - 实际上它与它没有任何关系,但它会做你要求的。
根据自己的喜好调整并疯狂。
干杯。