Thinkphp的MVC分层架构

Thinkphp5的目录架构:

一、Model 模型层

1、比较复杂的项目设计需要区分数据层、逻辑层、服务层等不同的模型层,因此可以在模块目录下面创建ModelLogicService目录,把对用户表的所有模型操作分成三层:

  • 数据层:Model/UserModel       用于定义数据相关的自动验证、自动完成和数据存取
  • 逻辑层:Logic/UserLogic          用于定义用户相关的业务逻辑
  • 服务层:Service/UserService   用于定义用户相关的服务接口等

2、这三个模型操作类统一都要继承Model类,例如: 

数据层:Home/Model/UserModel.class.php

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

逻辑层:Home/Logic/UserLogic.class.php

namespace Home\Logic;
use Think\Model;
class UserLogic extends Model{
}

服务层:Home/Service/UserService.class.php

namespace Home\Service;
use Think\Model;
class UserService extends Model{
}

3、我们可以使用Thinkphp内置的D方法来调用这三个模型类:

D('User') //实例化UserModel
D('User','Logic') //实例化UserLogic
D('User','Service') //实例化UserService

二、View 视图层

1、fetch() 传入的参数是模板名,用模板文件来输出。

class Index extends Controller{
    /**
     * 首页
     */
    public function index()
    {
        return $this->fetch();
    }
}

如果 fetch() 不传参数,程序会自动寻找 view/index/index.html渲染输出。

如果传参数,比如传入” hello“,那么程序会寻找view/index/hello.html来渲染输出。

     /**
     * 首页
     */
    public function index()
    {
        return $this->fetch('hello');
    }

2、display() 直接输出传递的内容,如果没有传递参数,会渲染出Layout,但不会有任何内容。

class Index extends Controller{
    /**
     * 首页
     */
    public function index()
    {
        return $this->display();
    }
}

如果传递参数, 比如 "hello",那么页面会直接输出字符串 "hello"。

     /**
     * 首页
     */
    public function index()
    {
        return $this->display('hello');
    }

3、view()和fetch(0的用法一样,如下:

class Index extends Controller{
    /**
     * 首页
     */
    public function index()
    {
        return view();
    }
}

三、Controller 控制器层

ThinkPHP的控制器层由核心控制器业务控制器组成:

  • 核心控制器由系统内部的App类完成,负责应用(包括模块、控制器和操作)的调度控制,包括HTTP请求拦截、转发、加载配置等。
  • 业务控制器则由用户定义的控制器类完成。

多层业务控制器的实现原理和模型的分层类似,如下:

Controller/UserController //用于用户的业务逻辑控制和调度
Event/UserEvent //用于用户的事件响应操作
  • 访问控制器 负责外部交互响应,通过URL请求响应,例如 http://域名/Home/User/login.html
  • 事件控制器 负责内部的事件响应,并且只能在内部调用,所以是和外部隔离的,确切的说,访问控制器之外的分层控制器都只能内部实例化调用。

1、访问控制器 Home/Controller/UserController.php 定义如下:

namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
        // 用户登录
        public function login(){
            // 触发用户登录事件
            $event = new \Home\Event\UserEvent();
            $event->login();
        }
         // 用户注册
        public function register(){
            // 触发用户注册事件
            $event = new \Home\Event\UserEvent();
            $event->register();
        }
}

2、事件控制器 Home/Event/UserEvent.php 定义如下:

namespace Home\Event;
use Think\Controller;
class UserEvent extends Controller{
        // 用户登录事件
        public function login(){
           //这里写业务逻辑
        }
        // 用户注册事件
        public function register(){
           //这里写业务逻辑
        }
}

3、调用多层控制器的三种方式:

直接实例化:

namespace Home\Controller;
use Think\Controller;
class UserController extend Controller {
        // 用户登录
        public function login(){
            // 触发事件
            $event = new \Home\Event\UserEvent();
            $event->login();
        }
}

A函数实例化:

namespace Home\Controller;
use Think\Controller;
class UserController extend Controller {
        // 用户登录
        public function login(){
            // 触发事件
            $event = A('User','Event');
            $event->login();
            // 或者直接使用
            // R('User/login','','Event');         
        }
}

R函数调用:

namespace Home\Controller;
use Think\Controller;
class UserController extend Controller {
        // 用户登录
        public function login(){
            // 触发事件
            R('User/login','','Event');         
        }
}

猜你喜欢

转载自blog.csdn.net/qq15577969/article/details/113725086