切换到另外一个项目
切换其它项目后,相关的config,include_path等都将加载为设定项目的,但是已经加载的class等是不可能销毁的,所以需谨慎使用
boolean Core_Core::change_project( string $project )
参数列表
参数 类型 描述 默认值 $project
string
$project
boolean
public static function change_project($project)
{
if (Core::$project==$project)
{
return true;
}
if ( !isset(Core::$core_config['projects'][$project] ) )
{
Core::show_500( __('not found the project: :project.', array(':project'=>$project) ) );
}
if ( !Core::$core_config['projects'][$project]['isuse'] )
{
Core::show_500( __('the project: :project is not open.', array(':project'=>$project) ) );
}
# 记录所有项目设置,当切换回项目时,使用此设置还原
static $all_prjects_setting = array();
if (Core::$project)
{
// 记录上一个项目设置
$all_prjects_setting[Core::$project] = array
(
'config' => Core::$config,
'include_path' => Core::$include_path,
'file_list' => Core::$file_list,
'project_dir' => Core::$project_dir,
'base_url' => Core::$base_url,
);
}
# 原来的项目
$old_project = Core::$project;
if (isset($all_prjects_setting[$project]))
{
# 设为当前项目
Core::$project = $project;
# 还原配置
Core::$config = $all_prjects_setting[$project]['config'];
Core::$include_path = $all_prjects_setting[$project]['include_path'];
Core::$file_list = $all_prjects_setting[$project]['file_list'];
Core::$project_dir = $all_prjects_setting[$project]['project_dir'];
Core::$base_url = $all_prjects_setting[$project]['base_url'];
# 清除缓存数据
unset($all_prjects_setting[$project]);
}
else
{
$p_config = Core::$core_config['projects'][$project];
if (!isset($p_config['dir']) || !$p_config['dir'])
{
Core::show_500(__('the project ":project" dir is not defined.', array(':project'=>$project)));
}
# 设置include path
$project_dir = DIR_PROJECT . $project . DS;
if (!is_dir($project_dir))
{
Core::show_500(__('not found the project: :project.', array(':project' => $project)));
}
# 项目路径
$project_dir = realpath(DIR_PROJECT . $p_config['dir']);
if (!$project_dir || !is_dir($project_dir))
{
Core::show_500(__('the project dir :dir is not exist.', array(':dir'=>$p_config['dir'])));
}
# 设为当前项目
Core::$project = $project;
$project_dir .= DS;
Core::$project_dir = $project_dir;
# 处理base_url
if (isset($p_config['url']) && $p_config['url'])
{
$url = rtrim(current((array)$p_config['url']),'/');
}
else
{
$url = '/';
}
if (IS_ADMIN_MODE)
{
if (isset($p_config['url_admin']) && $p_config['url_admin'])
{
$current_url = current((array)$p_config['url_admin']);
if (false===strpos($current_url[0],'://'))
{
$url .= trim($current_url, '/');
$url = trim($url, '/') .'/';
}
}
}
if (IS_REST_MODE)
{
if (isset($p_config['url_rest']) && $p_config['url_rest'])
{
$current_url = current((array)$p_config['url_rest']);
if (false===strpos($current_url[0], '://'))
{
$url .= trim($current_url, '/');
$url = trim($url,'/') .'/';
}
}
}
Core::$base_url = $url;
# 重置$include_path
Core::$include_path['project'] = array
(
Core::$project => $project_dir
);
# 重新加载类库配置
Core::reload_all_libraries();
}
# 记录debug信息
if (IS_DEBUG)
{
Core::debug()->info($project, '程序已切换到了新项目');
}
# 回调callback
if (Core::$change_project_callback)
{
foreach (Core::$change_project_callback as $fun)
{
call_user_func($fun, $old_project, $project);
}
}
return true;
}