课程咨询 :13623629309

太原PHP培训 > 达内新闻 > PHP 读书笔记之你不知道的MVC(上)
  • PHP 读书笔记之你不知道的MVC(上)

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

  • 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高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-30

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-30

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-30

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-30

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56

    在线客服系统