2018.7.26

系统架构:

  • 应用:基于统一入口文件访问的项目为一个应用。
  • 模块:一个应用下包含多课模块,每个模块再应用目录下面占一个独立的子目录。
  • 控制器:每个模块包含多个控制器,一个控制器通常体现为一个(控制器)类。
  • 操作:每个控制器类包含多个操作方法,每个操作是URL访问的最小单元。

命名规范:

目录和文件:

  • 框架核心类库的目录统一使用小写规范。
  • 应用目录依照团队规范,驼峰法或小写+下划线均可。
  • 类库、函数文件统一以.php为后缀。
  • 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写)。
  • 类名和类文件名保持一致,并统一采用驼峰法命名(首字母大写)

函数和类、属性命名:

  • 类的命名采用驼峰法,并且首字母大写,例如 User 、 UserType ,不需要添加controller、model 等后缀,UserController直接更改为User;函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip;
  • 方法的命名使用驼峰法,并且首字母小写或者使用下划线“_”,例如 getUserName ,_parseType ,通常下划线开头的方法属于私有方法;
  • 属性的命名使用驼峰法,并且首字母小写或者使用下划线“_”,例如 tableName 、 _instance ,通 常下划线开头的属性属于私有属性;
  • 以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload ;

常量和配置:

  • 常量以大写字母和下划线命名,例如 APP_DEBUG 和 APP_MODE ;
  • 配置参数以小写字母和下划线命名,例如 url_route_on ;

数据表和字段:

  • 数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name 字段,类似 _username 这样的数据表字段可能会被过滤。

应用类库命名空间规范:

  • 应用类库的根命名空间统一为app(可以设置APP_NAMESPACE更改);
  • 例如: app\index\controller\Index 和 app\index\model\User 。

命令行创建控制器:

  • 创建在index模块下的Atricle控制器,默认创建资源控制器:
    php think make:controller index/Article 
  • 创建普通控制器:
    php think make:controller index/Article --plain 

数据填充:

  • 命令行创建填充类文件:
    php think seed:create usersSeed
  • 使用db()方法定义往哪个表里填充数据;用insert()方法来设置插入的数据:
        public function run()
        {
            //run()定义往哪个表里填充数据,insert()设置插入的数据
            db('users')->insert(['username' => 'root','password' => md5('root')]);
        }

循环输出二维数组:

  • 二维数组声明:
  • $user = [
                [
                    'id' => 1,
                    'name' => 'aaa'
                ],
                [
                    'id' => 2,
                    'name' => 'bbb'
                ],
                [
                    'id' => 3,
                    'name' => 'ccc'
                ],
    ];
    return $this->fetch('',compact('user'));
  • html中循环输出:
  • <ul>
        {foreach $user as $v}
           <li>
                {$v.name}
           </li>
        {/foreach}
    </ul>
    

获取前台数据:

  • 直接声明在函数参数列表中,前端用 name="" 标识;
  • public function post(Request $request)
    {
        $post = $request->post();
    }

数据库:

  • query查询操作(参数绑定):
     Db::query('SELECT * FROM tableNmae WHERE id=?' , [8]); 
  • execute写入操作(占位符绑定):
     Db::execute('INSERT INTO tableName (id, name) values (:id, :name)', ['id' =>; 8, 'name' =>;abc]); 
  • 基本查询:
    // table方法必须指定完整的数据表名,返回数组,不存在则返回null
    Db::table('think_user')->where('id',1)->find();
    
    //select 方法查询返回一个数组,若不存在则返回空数组
    Db::table('think_user')->where('status',1)->select();
    
    //主从查询(啥优势?)从数据库直接操作
    //一旦某个个表写入了数据,那么后续查询操作都自动从主库读取
    $data = ['foo' => 'bar', 'bar' => 'foo'];
    Db::table('think_user')->insert($data);
    Db::name('user')->master()->where('id',1)->find();
    //若只需对某个个表进行操作,使用readMaster方法
    $data = ['foo' => 'bar', 'bar' => 'foo'];
    Db::table('think_user')
        ->readMaster()//参数为true时可以让后续所有数据表走主库
        ->insert($data);
    //配置文件中设置:
    'read_master' => true,
    
    //Query对象:
    $query = new \think\db\Query();
    $query->table('think_user')->where('status',1);
    Db::find($query);
    Db::select($query);
    //闭包查询:
    Db::select(function($query){
        $query->table('think_user')->where('status',1);
    });
    
    //查询某个字段:
    Db::table('think_user')->where('id',1)->value('name');
    //查询一列值:
    Db::table('think_user')->where('status',1)->column('name');
    
  • 添加数据:
    $data = ['foo' => 'bar', 'bar' => 'foo'];
    Db::table('think_user')->insert($data);
    
    //返回数据自增主键:
    $userId = Db::name('user')->getLastInsID();
    
    //添加多条数据:
    $data = [
        ['foo' => 'bar', 'bar' => 'foo'],
        ['foo' => 'bar1', 'bar' => 'foo1'],
        ['foo' => 'bar2', 'bar' => 'foo2']
    ];
    Db::name('user')->insertAll($data);
    

还不懂:

  • 数据库中chunk()函数作用。“该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用”。

CSUer