1. 简介
Joomla 是一款基于PHP开发的CMS系统,整体采用MVC模式开发,本文主要介绍Joomla扩展组件的MVC开发模式。
1.1 MVC模式
MVC模式是非常经典的开发模式,将代码功能分为三个部分,Model, View, Controller。其中 Model 用于提供数据对象;View 用户展示数据对象,并且与用户交互;Controller 则提供逻辑处理,将用户的操作进行特定逻辑的处理,更新Model,通知View。
1.2 Joomla 中的 MVC
Joomla系统提供了MVC模式开发的大量接口,可以方便的进行操作。其中Component开发大部分都是通过典型的MVC模式,并且包含了大部分自动化的加载和处理,使得开发非常简单。
2. MVC 开发规则
2.1 开发规则
Component 可以实现界面视图、逻辑操作,因此MVC模式在Component 中使用最多。
- 每一个Component 都包含前台界面和后台管理页面,开发分成两套代码;
- 每一个Component的主入口,都直接创建一个主控制器Controller用于分发;
- 每一个Controller会自动显示与当前Controller同名的View;
- 每一个View 内部的 get() 方法,都会自动加载同名的 Model 请求;
2.2 代码目录结构
Joomla扩展项目的代码目录有一套命名规则,根据规则能够让平台自动查找相关的类进行加载。
- 顶层目录的 controller.php 主控制器定义;
- controllers 目录:所有的视图控制器,自定义控制器,task控制器都在这里;
- views 目录:所有的视图类都在这里进行定义;
- models 目录:所有的数据访问相关的模型类在这里进行定义;
- tables 目录:所有的数据库表定义在这里进行定义;
- language 目录:所有的国际化字符串内容在这里定义;
3. Controller 说明
3.1 Controller 主控制器
Joomla中的Controller只有主控制器对象是通过手动创建的,其余的Controller,大部分是通过框架代码创建对象实例的。以下代码会创建一个Controller实例对象,并且会处理和分发所有的请求。
<?php
defined('_JEXEC') or die;
$controller = JControllerLegacy::getInstance('NovelSystem');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
上述代码是主入口代码,包含了非常重要的规则信息:
- JControllerLegacy::getInstance 会自动加载当前目录的controller.php;
- getInstance 的参数会影响所有的需要开发的代码;
- MVC各个对象的名称必须以 NovelSystem 开头,忽略大小写;
- 加载的controller.php 类名必须是 NovelSystemController
Joomla 以前缀的方式来规定一套代码的命名方式,从而实现自动化代码的加载。
例如: 前缀为NovelSystem 那么大部分类都需要以这个为前缀。
3.1 SubController 的说明
SubController 是在 controllers 目录中的所有Controller的总称,通常我们会创建controllers 目录,另外 controller 目录也是支持的。
SubController包含以下作用:
- 每一个View都可以有一个Controller,这个Controller与View名称同名
- Joomla网址中的 task 任务可以采用 subcontroller.task 的方式定义
- 每一个 task 在主控制器处理的时候,会自动分发给 SubController 来处理
举例说明SubController的使用方式:
现有View 对象 NovelSystemViewLogin,需要处理按钮点击的操作
NovelSystemViewLogin 视图中按钮会提交Form表单,Form表单的action 指向业务处理地址,这个地址包含参数 task=login,当用户点击操作的时候,Joomla平台会根据task参数来定位login。当主控制器没有找到对应的方法时,会分发给SubController。
- 主控制器执行 execute,处理task参数,没有处理,则转发给子控制器
- 获取View的名称 "前缀View名称" 的方式,找到实际名称 login,注意是小写
- 根据View名称 login, 去 controllers 目录查找 login.php 尝试加载
- 再根据 "前缀Controller名称" 的方式拼接为 NovelSystemControllerLogin
- 加载并且调用任务方法 login,发现存在,那么直接执行
4. View 说明
主Controller可以设置默认的视图名称,平台会自动加载指定名称的视图进行显示。主控制器默认的 task 任务是 “display”,会直接进行View的显示。
4.1 View 的命名规则
创建View 或者是加载View有一套名称命名规则,Joomla平台自动根据命名规范来进行加载。以下以 login 视图作为参考样例,前缀为 NovelSystem。
- 在views目录中,每一个文件夹都是一个View视图的名称
- login视图就需要创建 views/login/ 目录
- 视图php文件名称通常是
view.html.php
代表是一个html视图 - 视图类文件的完整路径为:
views/login/view.html.php
- 视图类内部 定义的类必须是继承 JViewLegacy 或者子类的;
- 类名称必须是 “前缀View名称” 的方式,对于login为: NovelSystemViewLogin
- 关于大小写:Joomla查找目录、文件的时候会将类名称进行小写转换,不需要特殊处理;
- 视图类的 display 方法会默认调用,是通过主控制器默认display来分发的。
4.2 View与Model的交互
大部分View需要加载数据并且显示,在View视图类中获取数据不需要直接与Model打交道,除非特殊情况。一般进行数据加载的方式是直接通过 View的get()方法来获取数据。
View 视图类 有一个 get($propertyName) 的方法,这个方法也是与Model交互的方法。
举例说明:
View 中调用方法 get('Item'); 注意大小写 会进行以下一些操作:
- View 内部检查是否获取了 model 对象,通过 model 对象获取数据;
- View 内部如果没有获取 model对象,那么根据规则获取 View的名称 login;
- 根据login 来查找 models/login.php 这个文件;
- 加载名称,类名需要是 “前缀Model名称”,本例为 NovelSystemModelLogin
- 实例化NovelSystemModelLogin对象,查找方法 getItem() 注意大小写;
- 调用 Model的 getItem() 方法,返回数据,交给View来使用;
- 注意get()方法的参数会直接拼接到 getXxxx 的方式,注意大小写。
5. 总结
Joomla的MVC模式大量的依赖于命名规范,通过内部的自动化加载的方式,将代码之间的关联隐藏在内部,开发人员只需要按照命名规范进行代码开发,实现代码的松耦合。
网友评论