我想将某些函数从控制器方法分离到库中以使它们模块化。基于URI,我试图路由到库方法,如果它存在。但是我必须加载库以使用php method_exists 函数检查方法。我发现检查它的唯一方法是将所有库方法放在配置数组中并检查那里的方法名称。如:
<?php
/**
* Application_config.php
*/
$config['extensions'] = array(
'News' => array(
'library' => 'articles_library',
'methods' => array(
'articles',
'article',
'edit_article',
'add_article',
'delete_article'
)
)
);
和
<?php
/**
* admin_controller.php
*
* all admin routes go to index
*/
class C3_base_controller extends Controller {
public function index() {
$lib_chk = 0;
$ext = $this->config->item('extensions');
foreach($ext as $item) {
foreach ($item['methods'] as $meth) {
if ($this->uri->segment(2) == $meth) {
$lib = $item['library'];
echo $this->$lib->$meth();
$lib_chk = 1;
}
}
}
if ($lib_chk == 0) {
// rest of controller...
}
}
}
有没有更好的方法来检查每个库中是否存在库方法而不加载库?必须复制应用程序配置中的每个方法只是要求它。
答案 0 :(得分:1)
您可以使用
method_exists
例如,如果要检查数据库对象是否存在
if(method_exists($this->CI->db, 'set')){
// code ...
}
答案 1 :(得分:0)
您是否正在寻求可重复使用代码的模块化,或者您是否正在创建一个具有可能存在或不存在的功能的应用程序......如插件中那样?
我很难想象您的基本应用程序具有硬编码的URL会导致可能不存在的库。你可以测试库而不是方法吗?检查目录并将文件名加载到数组中可能更简单,然后查看url或uri所需的库是否在该数组中。
但是如果你需要坚持现有的方法名称数组,那么你可以在“函数(空格)”之后出现方法名称的正则表达式,然后是括号吗?