thinkPHP中MVC模式的分析(一)

thinkPHP中MVC模式的分析(一)

M(model)-- 模型类

模型

在ThinkPHP中基础的模型类就是Think\Model 类,该类完成了基本的CURD、ActiveRecord模式、连贯操作和统计查询,一些高级特性被封装到另外的模型扩展中。

注意: 基础模型类的设计非常灵活,甚至可以无需进行任何模型定义,就可以进行相关数据表的ORM和CURD操作,只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的。

模型定义

模型类并非必须定义,只有当存在独立的业务逻辑或者属性的时候才需要定义。

模型类通常需要继承系统的\Think\Model类或其子类,下面是一个Home\Model\UserModel类的定义:

    namespace Home\Model;
    use Think\Model;
    class UserModel extends Model{
    }

模型类的作用大多数情况是操作数据库,按照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表的。

模型名 约定对应数据表(假设数据表的前缀定义是think_)
UserModel think_user
UserTypeModel think_user_type

模型实例化

一、直接实例化

实例化其他类库一样实例化模型类,例如:

$User = new \Home\Model\UserModel();
$Info = new \Admin\Model\InfoModel();
// 带参数实例化
$New = new \Home\Model\NewModel('blog','think_',$connection);

模型类通常都是继承系统的\Think\Model类,该类的构架方法格式为:
Model(['模型名'],['数据表前缀'],['数据库连接信息']);

三个参数都是可选的,大多数情况下,无需传入任何参数即可实例化。
| 参数 |描述 |
|:---- |:---- |
| 模型名 |模型的名称 和数据表前缀一起配合用于自动识别数据表名称 |
|数据表前缀|当前数据表前缀 和模型名一起配合用于自动识别数据表名称|
|数据库连接信息|当前数据表的数据库连接信息 如果没有则获取配置文件中的|

数据表前缀传入空字符串表示取当前配置的表前缀,如果当前数据表没有前缀,则传入null即可。

数据库连接信息参数支持三种格式:

  1. 字符串定义
    字符串定义采用DSN格式定义,格式定义规范为:数据库类型://用户名:密码@数据库主机名或者IP:数据库端口/数据库名#字符集
    例如:
    new\Home\Model\NewModel('blog','think_','mysql://root:1234@localhost/demo');
  2. 数组定义
    可以传入数组格式的数据库连接信息,例如:

    $connection = array(
        'db_type' => 'mysql',
        'db_host' => '127.0.0.1',
        'db_user' => 'root',
        'db_pwd' => '12345',
        'db_port' => 3306,
        'db_name' => 'demo',
        'db_charset' => 'utf8',
    );
    new \Home\Model\NewModel('new','think_',$connection);
  3. 配置定义
    我们可以事先在配置文件中定义好数据库连接信息,然后在实例化的时候直接传入配置的名称即可,例如:

      //数据库配置1
      'DB_CONFIG1'=>array(
          'db_type'=>'mysql',
          'db_user'=>'root',
          'db_pwd'=>'1234',
          'db_host'=>'localhost',
          'db_port'=>'3306',
          'db_name'=>'thinkphp'   
        ),
        //数据库配置2
        'DB_CONFIG2'=>'mysql://root:1234@localhost:3306/thinkphp',

    在配置文件中定义数据库连接信息的时候也支持字符串和数组格式,格式和上面的实例传入参数一样
    然后通过
    new \Home\Model\NewModel('new','think_','DB_CONFIG1');
    new \Home\Model\BlogModel('blog','think_','DB_CONFIG2');

通常我们都会在配置文件中配置相关参数,包括:

    'DB_TYPE' => '', // 数据库类型
    'DB_HOST' => '', // 服务器地址
    'DB_NAME' => '', // 数据库名
    'DB_USER' => '', // 用户名
    'DB_PWD' => '', // 密码
    'DB_PORT' => '', // 端口
    'DB_PREFIX' => '', // 数据库表前缀
    'DB_DSN' => '', // 数据库连接DSN 用于PDO方式
    'DB_CHARSET' => 'utf8', // 数据库的编码 默认为utf8

配置文件路径为 \Application\Common\Conf\config.php

二、D方法实例化

D方法其实就是通过实例化自定义模型类来操作数据库,一般在自定义模型类中通过M()方法来实例化数据表,当数据操作重复多次时,可以自定义模型类,然后在C层(控制层)直接调用模型类,可以减小代码重复性

实例化自定义模型类,eg.

<?php
//实例化模型
$User = D('User');
//相当于$User = new \Home\Model\UserModel();
//执行具体的数据操作
$User->select();
?>

\Home\Model\UserModel类不存在的时候,D函数会尝试实例化公共模块下面的\Common\Model\UserModel类,如果不存在,则会实例化系统的\Think\Model基类,同时对于已实例化过的模型,不会重复实例化。

D方法还可以支持跨模块调用,需要使用:
//实例化Admin模块的User模型
D'Admin/User';
//实例化Extend扩展命名空间下的Info模型
D'Extend://Editor/Info';

注意:跨模块实例化模型类的时候 不支持自动加载公共模块的模型类。

三、M方法实例化模型

D方法实例化模型类的时候通常是实例化某个具体的模型类,但是如果仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化,由于不需要加载具体的模型类,所以性能会更高。

M方法其实就是通过公共模型类来实例化数据表

例如:

//使用M方法实例化
$User = M('User');
//同$User = new \Think\Model('User');
$User->select();

M方法跨模块操作,例如:

//使用M方法实例化操作db_name数据库的ot_user表
$User = M('db_name.User','ot_');
$User->select();

其实一般情况M方法和\Think\Model类的参数是一样的
$New = M('new','think_',$connection);//等效于$New = new \Think\Model('new','think_',$connection);

M方法实例化的时候默认是实例化系统的\Think\Model类,如果我们希望实例化其他的公共模型类的话,可以使用如下方法;

$User = M('\Home\Model\CommonModel:User','think_','db_config');
//相当于$User = new \Home\Model\CommonModel('User','think_','db_config');
实例化空模型

如果仅仅试试用原生的SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作

//实例化空模型
$Model = new Model();
//或者使用M快捷方法是等效的
$Model = M();
//进行原生的SQL查询
$Model->query('SELECT * FROM think_user WHERE status = 1');

在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。

猜你喜欢

转载自www.cnblogs.com/xiezihan/p/9202434.html
今日推荐