美文网首页
Joomla 平台MVC编程模式详解

Joomla 平台MVC编程模式详解

作者: 老张带你飞 | 来源:发表于2020-02-09 11:42 被阅读0次

    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();
    

    上述代码是主入口代码,包含了非常重要的规则信息:

    1. JControllerLegacy::getInstance 会自动加载当前目录的controller.php;
    2. getInstance 的参数会影响所有的需要开发的代码;
    3. MVC各个对象的名称必须以 NovelSystem 开头,忽略大小写;
    4. 加载的controller.php 类名必须是 NovelSystemController

    Joomla 以前缀的方式来规定一套代码的命名方式,从而实现自动化代码的加载。
    例如: 前缀为NovelSystem 那么大部分类都需要以这个为前缀。

    3.1 SubController 的说明

    SubController 是在 controllers 目录中的所有Controller的总称,通常我们会创建controllers 目录,另外 controller 目录也是支持的。

    SubController包含以下作用:

    1. 每一个View都可以有一个Controller,这个Controller与View名称同名
    2. Joomla网址中的 task 任务可以采用 subcontroller.task 的方式定义
    3. 每一个 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。

    1. 在views目录中,每一个文件夹都是一个View视图的名称
    2. login视图就需要创建 views/login/ 目录
    3. 视图php文件名称通常是 view.html.php 代表是一个html视图
    4. 视图类文件的完整路径为: views/login/view.html.php
    5. 视图类内部 定义的类必须是继承 JViewLegacy 或者子类的;
    6. 类名称必须是 “前缀View名称” 的方式,对于login为: NovelSystemViewLogin
    7. 关于大小写:Joomla查找目录、文件的时候会将类名称进行小写转换,不需要特殊处理;
    8. 视图类的 display 方法会默认调用,是通过主控制器默认display来分发的。

    4.2 View与Model的交互

    大部分View需要加载数据并且显示,在View视图类中获取数据不需要直接与Model打交道,除非特殊情况。一般进行数据加载的方式是直接通过 View的get()方法来获取数据。

    View 视图类 有一个 get($propertyName) 的方法,这个方法也是与Model交互的方法。

    举例说明:

    View 中调用方法 get('Item'); 注意大小写 会进行以下一些操作:

    1. View 内部检查是否获取了 model 对象,通过 model 对象获取数据;
    2. View 内部如果没有获取 model对象,那么根据规则获取 View的名称 login;
    3. 根据login 来查找 models/login.php 这个文件;
    4. 加载名称,类名需要是 “前缀Model名称”,本例为 NovelSystemModelLogin
    5. 实例化NovelSystemModelLogin对象,查找方法 getItem() 注意大小写;
    6. 调用 Model的 getItem() 方法,返回数据,交给View来使用;
    7. 注意get()方法的参数会直接拼接到 getXxxx 的方式,注意大小写。

    5. 总结

    Joomla的MVC模式大量的依赖于命名规范,通过内部的自动化加载的方式,将代码之间的关联隐藏在内部,开发人员只需要按照命名规范进行代码开发,实现代码的松耦合。

    相关文章

      网友评论

          本文标题:Joomla 平台MVC编程模式详解

          本文链接:https://www.haomeiwen.com/subject/dtrgxhtx.html