| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 | <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------namespace think;class Build{    /**     * 根据传入的 build 资料创建目录和文件     * @access public     * @param  array  $build     build 列表     * @param  string $namespace 应用类库命名空间     * @param  bool   $suffix    类库后缀     * @return void     * @throws Exception     */    public static function run(array $build = [], $namespace = 'app', $suffix = false)    {        // 锁定        $lock = APP_PATH . 'build.lock';        // 如果锁定文件不可写(不存在)则进行处理,否则表示已经有程序在处理了        if (!is_writable($lock)) {            if (!touch($lock)) {                throw new Exception(                    '应用目录[' . APP_PATH . ']不可写,目录无法自动生成!<BR>请手动生成项目目录~',                    10006                );            }            foreach ($build as $module => $list) {                if ('__dir__' == $module) {                    // 创建目录列表                    self::buildDir($list);                } elseif ('__file__' == $module) {                    // 创建文件列表                    self::buildFile($list);                } else {                    // 创建模块                    self::module($module, $list, $namespace, $suffix);                }            }            // 解除锁定            unlink($lock);        }    }    /**     * 创建目录     * @access protected     * @param  array $list 目录列表     * @return void     */    protected static function buildDir($list)    {        foreach ($list as $dir) {            // 目录不存在则创建目录            !is_dir(APP_PATH . $dir) && mkdir(APP_PATH . $dir, 0755, true);        }    }    /**     * 创建文件     * @access protected     * @param  array $list 文件列表     * @return void     */    protected static function buildFile($list)    {        foreach ($list as $file) {            // 先创建目录            if (!is_dir(APP_PATH . dirname($file))) {                mkdir(APP_PATH . dirname($file), 0755, true);            }            // 再创建文件            if (!is_file(APP_PATH . $file)) {                file_put_contents(                    APP_PATH . $file,                    'php' == pathinfo($file, PATHINFO_EXTENSION) ? "<?php\n" : ''                );            }        }    }    /**     * 创建模块     * @access public     * @param  string $module    模块名     * @param  array  $list      build 列表     * @param  string $namespace 应用类库命名空间     * @param  bool   $suffix    类库后缀     * @return void     */    public static function module($module = '', $list = [], $namespace = 'app', $suffix = false)    {        $module = $module ?: '';        // 创建模块目录        !is_dir(APP_PATH . $module) && mkdir(APP_PATH . $module);        // 如果不是 runtime 目录则需要创建配置文件和公共文件、创建模块的默认页面        if (basename(RUNTIME_PATH) != $module) {            self::buildCommon($module);            self::buildHello($module, $namespace, $suffix);        }        // 未指定文件和目录,则创建默认的模块目录和文件        if (empty($list)) {            $list = [                '__file__' => ['config.php', 'common.php'],                '__dir__'  => ['controller', 'model', 'view'],            ];        }        // 创建子目录和文件        foreach ($list as $path => $file) {            $modulePath = APP_PATH . $module . DS;            if ('__dir__' == $path) {                // 生成子目录                foreach ($file as $dir) {                    self::checkDirBuild($modulePath . $dir);                }            } elseif ('__file__' == $path) {                // 生成(空白)文件                foreach ($file as $name) {                    if (!is_file($modulePath . $name)) {                        file_put_contents(                            $modulePath . $name,                            'php' == pathinfo($name, PATHINFO_EXTENSION) ? "<?php\n" : ''                        );                    }                }            } else {                // 生成相关 MVC 文件                foreach ($file as $val) {                    $val      = trim($val);                    $filename = $modulePath . $path . DS . $val . ($suffix ? ucfirst($path) : '') . EXT;                    $space    = $namespace . '\\' . ($module ? $module . '\\' : '') . $path;                    $class    = $val . ($suffix ? ucfirst($path) : '');                    switch ($path) {                        case 'controller': // 控制器                            $content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}";                            break;                        case 'model': // 模型                            $content = "<?php\nnamespace {$space};\n\nuse think\Model;\n\nclass {$class} extends Model\n{\n\n}";                            break;                        case 'view': // 视图                            $filename = $modulePath . $path . DS . $val . '.html';                            self::checkDirBuild(dirname($filename));                            $content = '';                            break;                        default:                            // 其他文件                            $content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}";                    }                    if (!is_file($filename)) {                        file_put_contents($filename, $content);                    }                }            }        }    }    /**     * 创建模块的欢迎页面     * @access protected     * @param  string $module    模块名     * @param  string $namespace 应用类库命名空间     * @param  bool   $suffix    类库后缀     * @return void     */    protected static function buildHello($module, $namespace, $suffix = false)    {        $filename = APP_PATH . ($module ? $module . DS : '') .            'controller' . DS . 'Index' .            ($suffix ? 'Controller' : '') . EXT;        if (!is_file($filename)) {            $module = $module ? $module . '\\' : '';            $suffix = $suffix ? 'Controller' : '';            $content = str_replace(                ['{$app}', '{$module}', '{layer}', '{$suffix}'],                [$namespace, $module, 'controller', $suffix],                file_get_contents(THINK_PATH . 'tpl' . DS . 'default_index.tpl')            );            self::checkDirBuild(dirname($filename));            file_put_contents($filename, $content);        }    }    /**     * 创建模块的公共文件     * @access protected     * @param  string $module 模块名     * @return void     */    protected static function buildCommon($module)    {        $config = CONF_PATH . ($module ? $module . DS : '') . 'config.php';        self::checkDirBuild(dirname($config));        if (!is_file($config)) {            file_put_contents($config, "<?php\n//配置文件\nreturn [\n\n];");        }        $common = APP_PATH . ($module ? $module . DS : '') . 'common.php';        if (!is_file($common)) file_put_contents($common, "<?php\n");    }    /**     * 创建目录     * @access protected     * @param  string $dirname 目录名称     * @return void     */    protected static function checkDirBuild($dirname)    {        !is_dir($dirname) && mkdir($dirname, 0755, true);    }}
 |