为了简单操作,ThinkPHP还提供了3种方式快速实例化模型,如下所示。new Model,使用传统的new方式实例化Model基类,该类封装了操作数据库的常见方法。需要注意的是new方式不能实例化自定义的模型。M,快捷函数实例化模型。M函数可以在初始化数据表后再实例化一个自定义的模型类。继续以前面的内容为例,如果现在需要实例化UserModel类,那么正确的实例化方式如以下代码所示。......
2023-11-04
Model类提供了一些基础的数据库操作方法,当需要进行复杂的数据库操作时,就需要使用自定义模型了。自定义模型能够实现更加灵活和强大的数据库操作,特别是能够针对项目一些特殊的功能定制数据库操作方案,例如数据检验、数据缓存、数据加工等。使用自定义模型,通常情况下也是需要与数据库的真实表名进行映射,这是MVC的一条规范,否则模型就与普通的功能类无异。在调用时,系统提供了D函数,用于快速实例化自定义模型。下面将结合示例代码介绍自定义模型的创建和使用。
1.创建自定义模型
自定义模型存放于项目Lib/Model目录下,假设需要为数据表tpk_article数据表建立模型映射,那么需要创建ArticleModel.class.php文件。创建完成后,在使用D函数进行实例化时,ArticleModel模型将与tpk_article表进行映射。由于所有模型都需要继承于Model基类,所以ArticleModel拥有Model所有特性,这里将使用select()方法输出tpk_article表数据,如以下代码所示。
使用自定义模型之后,在进行数据表操作时就更加灵活。比如需要让tpk_article表的内容能够根据客户所在的地区显示当地的新闻,那么就可以在ArticleModel模型中对数据进行加工和处理,如以下代码所示。
图7-1 tpk_article表结构(www.chuimin.cn)
上述代码中,使用了$this->where连贯操作,该语句对SQL查询语句中的where进行了封装,实际上效果是等同的。在where查询条件中,限制返回数据条件为当前地区的新闻,checkUserArea是一个自定义方法,用于根据客户端IP,自动取得当前用户所在的区域,作为一个功能方法不需要对外公开,所以修饰为protected。ArticleModel模型对应的tpk_article数据表结构如图7-1所示。
2.使用自定义模型
使用自定义模型非常简单,系统提供了D函数,用于快速实例化自定义模型。以前面创建的示例为例,在动作中只需要调用article方法即可,如以下代码所示。
这里只是简单地演示自定义模型影射数据表的过程。可以看到,使用自定义模型映射数据表比直接使用基类的模型映射更加灵活和强大。事实上这种方式在主流的MVC中使用得最广泛,甚至是必须这样做,例如前面章节介绍过的Zend Framework、Symfony、CakePHP等。使用自定义模型能够实现更复杂及更高级的功能,这里只是简单地演示其使用步骤,在实际应用开发中可以根据需求利用自定义模型对数据进行深度的加工、处理等。
自定义模型映射,一个模型对应一个数据表。所有增、删、改、查都在模型类中完成,大大地方便了文件及代码的管理。自定义模型的最大特点是代码容易移植,高度重用。例如一个客户端只能访问XML格式数据,此时自定义模型一句代码都不用更改,只需要改变动作中的输出格式即可。
这里需要说明的是,在ThinkPHP中模型代码是可以直接移植到动作中的,但这样就让代码的重复利用变差,代码的管理、维护变得困难,所以建议读者尽量将数据库操作的逻辑封装到自定义模型中,这也是MVC编程所提倡的思想。
有关PHP MVC开发实战的文章
为了简单操作,ThinkPHP还提供了3种方式快速实例化模型,如下所示。new Model,使用传统的new方式实例化Model基类,该类封装了操作数据库的常见方法。需要注意的是new方式不能实例化自定义的模型。M,快捷函数实例化模型。M函数可以在初始化数据表后再实例化一个自定义的模型类。继续以前面的内容为例,如果现在需要实例化UserModel类,那么正确的实例化方式如以下代码所示。......
2023-11-04
ThinkPHP的基础模型类名为Model,该类定义了操作数据库的常用方法,继承于Model类的PHP类称为自定义模型。ThinkPHP对模型的定义不太严格,对中小型的团队开发而言,这种MVC处理方式是高效和灵活的,开发人员可以像使用PHP普通类一样调用模型,下面将介绍怎样创建一个正确的自定义模型类。在home/Lib/Model目录下创建一个PHP文件,并命名为UserModel.class.php,打开该文件,创建一个PHP类,命名为UserModel,并使该类继承于Model类。这样,UserModel.class.php就是一个标准的ThinkPHP项目模型文件。......
2023-11-04
ThinkPHP的一大特点就是扩展灵活,同样行为也是可以自定义扩展的。接下来将深入介绍自定义行为扩展的实现。上述代码是一个名为AutoCheckUserLogin的自定义行为类。最后还需要确保自定义行为类继承于Behavior基类。事实上,AutoCheckUserLogin配置项并不是必需的,也就是说在配置时,自定义行为就已经能够正常运行了,配置项只不过用于实现灵活的配置。此时,再次访问项目,只有Index控制器下的页面受AutoCheckUserLogin自定义行为影响,其他页面则不受影响。......
2023-11-04
图6-4 网站布局ThinkPHP 3.0之前的模板引擎没有布局的概念,但开发人员可以使用include包含文件达到网站布局的效果。布局文件允许嵌套,如果网站页面更加复杂,还可以结合include等标签实现开发需求。另外,如果不需要全局布局,也可以单独在当前页面中使用布局文件,只需要在当前页面头部加上
2023-11-04
在模型与表映射过程中,系统会智能地根据配置信息处理好模型名与表名之间的关系。例如上述代码中的User表名,事实上数据库中并不存在User表,但是系统会根据配置信息DB_PREFIX指定的数据表名前缀智能地添加到模型中,因为User首字母为大写,系统会强制给User添加表前缀,最终的表名称为tpk_user。模型映射不仅能够智能地添加表前缀,还可以添加表后缀。假设数据表名为tp_user_local,那么在模型映射时只需将表名与后缀名首字母改成大写即可。......
2023-11-04
PHP 5后的版本借鉴了大量Java思想,得益于早期PHP面向过程编程支持,PHP在实现MVC设计中变得较灵活、易用。但是随着PHP 5.x的到来,各种MVC框架的出现,尤其Zend推出的Zend Framework,彻底地改变了PHP状况,使得PHP也能够实现优雅的Web编程。MVC设计模式将使代码将变得简洁。但是在MVC设计模式中,Index称为动作。当然,MVC只是一种设计模式,在开源的PHP编程世界中,已经拥有众多的MVC编程框架。......
2023-11-04
接下来将以HAS_ONE、BELONGS_TO、HAS_MANY这3种最常见的关联模型类型作为讲解对象,深入浅出地介绍关联模型的CURD实际应用。关联查询可以使用所有Model基础模型的CURD操作方法,例如find、delete等。HAS_MANY是关联模型中最常用的操作,HAS_MANY的使用非常简单,和HAS_ONE相比,只需要修改其中的关系类型即可,其他的元素几乎不用修改。......
2023-11-04
前面已经简单介绍过ThinkPHP视图引擎,这些标签处理机制类似于JSP tag,使用XML作为标签的渲染方式,开发人员可以方便地在网页中嵌入XML标签,然后由ThinkPHP视图引擎解释成标准的PHP代码。ThinkPHP的视图引擎之所以高效,主要体现在它的标签扩展性。ThinkPHP的视图标签扩展性够完美地与后台控制器代码相结合,例如在Smarty中使用函数功能,首先需要在后台PHP代码注册,而在ThinkPHP中完全不需要,如以下代码所示。......
2023-11-04
相关推荐