我正在尝试使用 $this->load->add_package_path 向我的 CI 应用程序添加一个新的子应用程序。我可以看到如何将其用于视图等:只需放
$this->load->add_package_path("/mypackage");
在控制器ctor中。不幸的是,这无济于事,因为我想从包路径中找到控制器:这似乎是一个先有鸡还是先有蛋的问题。还有其他地方可以调用 add_package_path 吗(例如 index.php)?
我正在尝试使用 $this->load->add_package_path 向我的 CI 应用程序添加一个新的子应用程序。我可以看到如何将其用于视图等:只需放
$this->load->add_package_path("/mypackage");
在控制器ctor中。不幸的是,这无济于事,因为我想从包路径中找到控制器:这似乎是一个先有鸡还是先有蛋的问题。还有其他地方可以调用 add_package_path 吗(例如 index.php)?
通过跟踪 CI 弄清楚了。事实证明你不能这样做。您可以将自己的控制器放在 /application/controllers 的子目录中,但不能将它们放在其他地方:特别是,正如http://codeigniter.com/user_guide/libraries/loader.html所暗示的,
这些元素可以是库(类)视图文件、帮助程序、模型或您自己的文件。
“您自己的文件”不包括控制器。通过对 CodeIgniter.php 和 Router.php 进行更改,我最终能够让它查看除 APPPATH 之外的 ENVIRONMENT 设置。但是,我不喜欢进行这种更改,因此我取消了更改。我会把它放在这里以防其他人可以从中受益。
Router.php 更改:
function _validate_request($segments)
{
...
// Does the requested controller exist in the root folder?
if (file_exists(APPPATH.'controllers/'.$segments[0].'.php')
|| file_exists(ENVIRONMENT.'/controllers/'.$segments[0].'.php')) // New bit here
{
return $segments;
}
....
}
CodeIgniter.php 更改,'围绕第 246 行:
if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'))
{
// New bit here
if ( ! file_exists(ENVIRONMENT.'/controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'))
{
show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.');
}
include(ENVIRONMENT.'/controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');
} else {
include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');
}