• ci框架根据配置自动生成controller控制器和model控制器(改版本)


    CI修改如下:

    	if($modle_file=config_item('modle_file'))
    	{
    		if ($modle_file === TRUE)
    		{
    			$modle_file=config_item('modle_type');
    
    			$MOF=& load_class('Newfile','core');
    
    			//$MOF->createModule($modle_file);  //创建文件加载类
    			$MOF->createModule();
    		}
    	}
    
    
    
    
    <?php
    
    /**
     * 这是一个扩展类
     * 
     * 主要用来添加 常用的model模块还有controller控制器
     */
    defined('BASEPATH') OR exit('No direct script access allowed');
    
    /**
     * model、controller扩展类
     *
     * @package    CodeIgniter
     * @subpackage Libraries
     * @category   Logging
     * @author     shaonian
     * @link        
     */
    class CI_Newfile
    {
    
        /**
         * 常用模块列表
         *
         * @var array
         */
        protected $_model_arr=['Admin'];
        
        //模块前戳
        protected $_model_prefix='Model_';
    
        //自定义模块
        protected $custom_model=[];
    
        /**
         * 常用控制器列表
         *
         * @var int
         */
        protected $_controller_arr = [];
        
        //自定义控制器
        protected $custom_controller=[];
    
        /**
         * 目录权限
         *
         * @var int
         */
        protected $_chmod = 0775;
    
        /**
         * 创建时间
         *
         * @var string
         */
        protected $_date_fmt = 'Y-m-d H:i:s';
        
    
        //获取全部的定义
        protected $_arr_info=[];
    
        
    
        /**
         * 控制类
         *  
         * 其实这个类 也可以写在扩展里面 因为 ci本来就让扩展用法的
         *
         * 这里支持两种方法 一种 在定义的环境下config配置 一种定义下的直接读取单独个配置文件
         *
         * @return void
         */
        public function __construct($is_build=false)
        {
            $config =& get_config();  //加载全局配置文件
    
            if (!empty($config['custom_controller']))
            {
                $this->custom_controller=$config['custom_controller'];
            }
    
            if (!empty($config['custom_model']))
            {
                $this->custom_model=$config['custom_model'];
            }
        }
    
        
    
        /**
         * 根据路径创建模块
         *
         * @param  [type] $path
         * @return void
         */
        public function createModule($is_type_system='new')
        {
                
            //根文件
            // $Model_path_base=BASEPATH.'core/newfile/model/'.$is_type_system.DIRECTORY_SEPARATOR;
    
            // $this->mkdirs($Model_path_base); //递归创建目录
    
            // $get_content=$this->file_get_contents_write($Model_path_base);
    
    
            //马上
    
            //还有一种方法
            /**
             * $content=$get_content instanceof Iterator; 这个详细的方法 看php手册的 迭代接口
             */
    
            // foreach($get_content as $model_key=>$content)
            // {
    
            //     //创建文件
            //     $this->mkdirs(APPPATH.'models/sys/');
    
            //     file_put_contents(APPPATH.'models/sys/'.$model_key.'.php', $content);
            // }
    
    
            if(!empty($this->custom_model)) {
    
                //循环自定义的控制器
                foreach($this->custom_model as $model_k=>$model_v) {
                        
                    if (strpos($model_v, '/')!==false) {
                            
                        //这段程序处理前面的目录的 支持无限极目录
                        $dir_arr=explode('/', rtrim($model_v, '/'));
                        array_pop($dir_arr);
                        $dir_str=(count($dir_arr)>=2)?implode('/', $dir_arr):$dir_str[0];
                        $this->mkdirs(APPPATH.'models/'.$dir_str.DIRECTORY_SEPARATOR);
    
                    } 
                    //读模板内容
                    $content_con=$this->modelTpl($this->_model_prefix.ucwords($model_v));
    
                    if(!empty($dir_str)) {
    
                        $file_path=APPPATH.'models/'.$dir_str.DIRECTORY_SEPARATOR.$this->_model_prefix.ucwords($model_v).'.php';
                        
                    }
                    $file_path=APPPATH.'models/'.$this->_model_prefix.ucwords($model_v).'.php';
    
                    if (file_exists($file_path)==true) {
                        
                        continue;
                    }
    
                    //echo $file_path;
                    file_put_contents($file_path, $content_con);
    
                }
            }
            
        }
    
    
        
        /**
         * 这里用的是思想模板替换
         * 这里我都没判断应用目录是否可写 这是不对的
         *
         * @param  string $is_type_system
         * @return void
         */
        public function createController($is_type_system='new')
        {
            //   //根文件
            //   $controller_path_base=BASEPATH.'core/newfile/controller/'.$is_type_system.DIRECTORY_SEPARATOR;
    
            //   $this->mkdirs($controller_path_base); //递归创建目录
      
            //   $get_content=$this->file_get_contents_write($controller_path_base);
    
            //   //这里创建常用的代码
            // foreach($get_content as $controller_key=>$content)
            //   {
                
            //     //创建文件
            //     $this->mkdirs(APPPATH.'controller/sys/');
      
            //     file_put_contents(APPPATH.'controller/sys/'.$controller_key.'.php', $content);
            // }
    
              //这里创建配置文件中的控制器,支持层级创建目录
    
            if(!empty($this->custom_controller)) {
    
                //循环自定义的控制器
                foreach($this->custom_controller as $controller_k=>$controller_v) {
                        
                    if (strpos($controller_v, '/')!==false) {
                            
                        //这段程序处理前面的目录的 支持无限极目录
                        $dir_arr=explode('/', rtrim($controller_v, '/'));
                        array_pop($dir_arr);
                        $dir_str=(count($dir_arr)>=2)?implode('/', $dir_arr):$dir_str[0];
                        $this->mkdirs(APPPATH.'controller/'.$dir_str.DIRECTORY_SEPARATOR);
    
                    } 
                    //读模板内容
                    $content_con=$this->controolerTpl(ucwords($controller_v));
    
                    if(!empty($dir_str)) {
    
                        $file_path=APPPATH.'controllers/'.$dir_str.DIRECTORY_SEPARATOR.ucwords($controller_v).'.php';
                        
                    }
                    $file_path=APPPATH.'controllers/'.ucwords($controller_v).'.php';
    
                    if (file_exists($file_path)==true) {
    
                        continue;
                    }
    
                    //echo $file_path;
                    file_put_contents($file_path, $content_con);
    
                }
            }
    
        }
    
    
        /**
         * 生成controller模板
         *
         * @param  [type] $controoler_name
         * @return void
         */
        public function controolerTpl($controoler_name)
        {
            $content='';
            $content.="<?php
    defined('BASEPATH') OR exit('No direct script access allowed');
    
    
    
    class {$controoler_name} extends MY_Controller
    {
    
    ";
            $content.="    public function __construct()
        {
            parent::__construct();
        }
    
    }";
     
            return $content;
        }
    
    
        public function modelTpl($model_name)
        {
            $content='';
             $content.="<?php
    defined('BASEPATH') OR exit('No direct script access allowed');
    
    
    
    class {$model_name} extends MY_Model
    {
    
    ";
            $content.="    public function __construct()
        {
            parent::__construct();
        }
    
    }";
    
            return $content;
    
        }
    
    
        /**
         * 创建目录
         *
         * @access protected
         * @param  string $dirname 目录名称
         * @return void
         */
        protected static function checkDirBuild($dirname)
        {
            !is_dir($dirname) && mkdir($dirname, 0755, true);
        }
    
    
        /**
         * 根据传入的 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 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
    " : ''
                    );
                }
            }
        }
    
        /**
         * 循环读取文件并创建
         * 其实可以不用生成器的 反正就4个文件 file_Get_content直接读取 这些文件 还不到 10kb也挺快的
         */
        public function file_get_contents_write($path)
        {
            foreach($this->_model_arr as $val)
            {
                if(!file_exists($path.strtolower($val).'.txt')) {
                       echo "你的文件{$this->_model_prefix}{$val}未找到,请放入后查看";exit(0);
                }
                    yield $this->_model_prefix.$val=>file_get_contents($path.strtolower($val).'.txt');
            }
        }
    
    
        /**
         * 递归创建目录
         *
         * @param  [type] $dir
         * @return void
         */
        public function mkdirs($dir=null)
        {
            return is_dir($dir) or ($this->mkdirs(dirname($dir))) and mkdir($dir, 0755);
        }
    
    
        //在这里要实现数据库的话 得调用文件的为 database.php 文件 
    
        //还得吧 loader的db文件拿过来用 这个类 可以在controller后面加载 
        
    
    
    
    }
    
    
    
    
  • 相关阅读:
    html文件上传函数
    form上传以及下载文件回调
    WIN2008R2 64位平台IIS发布WEB项目 未在本地计算机上注册“MICROSOFT.ACE.OLEDB.12.0"错误提示
    回文数
    搜索旋转排序数组
    Kotlin注解处理(Kapt)
    关于@FeignClient的属性源码分析
    sonatype-nexus私服的搭建与settings的设置
    简话ReentrantLock的可重入锁概念
    springboot2.1与单节点redis的集成实战
  • 原文地址:https://www.cnblogs.com/mengluo/p/10178233.html
Copyright © 2020-2023  润新知