选择语言 :

 Core_Core::change_project

切换到另外一个项目

切换其它项目后,相关的config,include_path等都将加载为设定项目的,但是已经加载的class等是不可能销毁的,所以需谨慎使用

boolean Core_Core::change_project( string $project )
throws
Exception 失败则抛出异常(比如不存在指定的项目) 失败则抛出异常(比如不存在指定的项目)

参数列表

参数 类型 描述 默认值
$project string $project
返回值
  • boolean
File: ./core/classes/core.class.php
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;
}