太原PHP培训
达内太原php培训中心

0351-5608878

热门课程

PHP 读书笔记之你不知道的MVC(上)

  • 时间:2016-11-08
  • 发布:PHPer的进击之路
  • 来源:PHPer的进击之路

PHP 读书笔记之你不知道的MVC(上)

今天继续为大家带来php中很多的小秘密,这些小秘密将会对大家带来很长足的进步。

MVC和其的局限性

mvc如今充斥在整个软件开发中,前端讲mvc,后端讲mvc

前端:Backbone.jsAngularJSEmber.js…

后端:Ruby on RailsCodeIgniterLaravelDjango…

这么多的mvc,在初学的时候,很难分辨清楚到底mvc是什么,怎么每一个mvc看上去都不怎么一样?

查看维基百科上的定义,可以看到mvc中最重要的一点是:

Model should inform View about the changes (observer pattern)

model发生改变的时候,要主动通知view,这一项在server-side framework中基本上不可能的(当然可以通过socket等手段),因此我们平时server-side framework中声称的mvc都是不确切的,那平时我们使用的“mvc”是什么呢?

View 传送指令到 Controller

Controller 完成业务逻辑后,要求 Model 改变状态

Model 将新的数据发送到 View,用户得到反馈

Model2 MVC

Model 2 is a complex design pattern used in the design of Java Web applications which separates the display of content from the logic used to obtain and manipulate the content.

In a Model 2 application, requests from the client browser are passed to the controller. The controller performs any logic necessary to obtain the correct content for display.

model2mvcserver-side上的实作,其中controller负责从Modelview之间的沟通。

比较下model2mvc中各角色的区别:

角色Modelviewcontroller

MVC接收请求,并通知view监听着model,当model发生变化的时候,改变(presentation)接收到请求后,转交给model处理

Model2接受请求,回传给controller不具有行为,只是等待controller塞入数据到(template)接收到请求后,转交给model处理,并将处理结果塞入view

我们知道了我们讨论的MVCserver端其实是model2后,下面我们为了更好的理解MVC,我们按个讨论各个模块。

MVC模块

先介绍最重要的模块Model.

Model的理解

第一件必须要阐述清楚的是:

model is a layer.

model不是什么?

model不是简单意义上的类或者对象,同时model也不是orm或者数据库表的抽象。

model是什么?

在好的mvc变种中,model包含了所有的业务逻辑,并且model layer主要是由下面三种结构组成:

Domain Objects

A domain object is a logical container of purely domain information; it usually represents a logical entity in the problem domain space. Commonly referred to as business logic.

领域对象包含了特定的领域知识,可以理解为业务逻辑。

领域对象关注一些业务规则,譬如下单的时候要验证数据有效性,发货的时候要保证用户正确支付过等等。领域对象应该完全不关注存储,不管数据是来自redis还是mysql等。

Data Mappers

数据映射器只负责存储,如果是mysql,则关注数据怎么从mysql中读取后转换为领域对象,以及怎么将领域对象存储到mysql

Services

可以将services想象成 “higher level Domain Objects” ,和领域逻辑不同的是,Service关注是Domain objectsMappers之间的交互。

这些Services最终是暴露出公告接口来供其他层来使用model layer的业务逻辑。

当然,我们也可以避免services,但是不可避免的暴露些领域逻辑到controllers中。

譬如你要创建一个订单,可能会涉及到多个领域对象,这样你可以将这个抽象城一个Service,这样controller中只需要使用service就可以了,而不必和多个Domain object打交道。

此处servervice还包括了一些依赖的第三方组件和自己提供的组件,譬如你可以发认为送邮件组件是一个Service,不管这个’mail sender’是自己实现还是第三方的。

怎么和model打交道?

model layer进行交互,应该只通过services,这样分离的好处是:

符合单一职责原则(SRP)

如果逻辑改变了,提供了回旋的余地

尽可能式controller保持简单

如果需要依赖外部api的话,尽可能提供一个清晰的蓝图

怎么创建model?

因为model不再是一个简单的类,因此不再需要”build the model”,相反的,我们开始创建services,然后实现Domain ObjectsMappers

代码示例:

classController{

publicfunctionhandle(Recognitions $service){

$service = newRecognitions(

newDataMapperFactory(),

newDomainObjectFactory

);

$service->authenticate($request->get('username'),

$reuqest->get('password'));

}

}

namespaceService;

classRecognitions

{

// -- snip --

/* This is an EXAMPLE, not a production-level code.

Do not copy-paste! */

publicfunctionauthenticate( $username, $password )

{

$account = $this->domainObjectFactory->build('User');

$mapper = $this->dataMapperFactory->build('User');

$account->setUsername( $username );

$mapper->fetch( $account );

if( $account->matchPassword($password) )

{

$state = $this->dataMapperFactory->build('Cookie');

}

else

{

$state = $this->dataMapperFactory->build('Session');

}

$state->store($account);

}

// -- snip --

}

可以看到在controller中,我们只需要通过service来访问我们的Model层。

好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:数据分析8个流程与常用7个思路
下一篇:PHP 读书笔记之你不知道的MVC(下)

太原php培训资源站

太原PHP编程开发并发编程槽与坑

Php开发规划自己的路

太原php培训老生常谈php

选择城市和中心
贵州省

广西省

海南省

台湾