Thinkphp5的目录架构:
一、Model 模型层
1、比较复杂的项目设计需要区分数据层、逻辑层、服务层等不同的模型层,因此可以在模块目录下面创建Model
、Logic
和Service
目录,把对用户表的所有模型操作分成三层:
- 数据层: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');
}
}