设计思想中有两种极端:大而全、小而美。

一般我们常用的库是小而美,用的框架是大而全。从Symfony实现Component式开发开始,框架的组件化逐渐成为趋势。我们可以任意的组合各种Compoent来形成自己的PHP框架,比如B团队出的Db及ORM引擎、B团队出的缓存引擎、E团队出的Route映射引擎、C团队出的DI、D团队出的MVC、X团队的单元测试工具。Composer出现后,提供了高度便捷性,加速了这种趋势。

Yii这个框架是典型的全栈式框架,常规应用开发所需功能几乎都揉和到一个项目中。yii2到现在,它的核心实现还是以传统Web应用场景为重心。但这只是他的形,他的核心思想里是组件化的,有Component这样的完善机制,只是没有拆开成各个子项目而已。

如何将Yii2这样的项目拆成Component式的子项目呢,你可以自己想想!

代码重用据说是OOP思想最想要解决的问题?如果我们写出的每个功能,抽象的库、具体的业务模块,都可以实现最大化独立和重用,似乎是很美好的一件事情,借助于开源的趋势,若干年的积累后,只要像搭积木一样组合一下,就可以完成满足实际需求的应用系统。

请注意上文中的“搭积木”这个词,搭积木源自于孩童时的游戏,不同的积木组合可以拼成各种房子、各种车等,但积木组合出来的都是人所处环境的实物,和应用系统这种存在于计算机世界的事物在目前的认知上是完全不同的体系,搭积木这个词用在应用开发上,合适吗?

通常我们的结论是这样:代码可以以库的形式重用,重复的功能模块式开发和引用,但不同的应用有不同的场景,还是需要以比较“巧妙”的方式去定制的,比如“钩子”、“行为”、“事件”、“插件”等。

话再说回来,组件化可以到什么程度呢?

市面上成功的CMS等系统都通过“插件”或“扩展”,配合“应用市场”建立了比较强大的开发者生态圈,通过“巧妙”的机制实现具体场景的定制化,满足用户的需求。

举个简单的例子来说,TP的Model是这样的:

在具体的Model里如UserModel,覆盖

// 删除数据前的回调方法
protected function _before_delete($options) {}
// 删除成功后的回调方法
protected function _after_delete($data,$options) {}

这两个方法以实现数据删除前和删除后触发的关联操作,但Yii中,只要继承Component基类实现的类,都可以使用事件和行为来扩展原来的逻辑,而且可从外部来定义,非常灵活。

yii中的用法大致为:

$model = new User;

$model->on(‘before_delete’, $callabe, $data);

TP的控制器中也有钩子,应该也算是一种实现方式吧。

库Component化、业务功能以模块化的方式实现,就可以实现扩展和定制的无限可能性。

PHP组件化开发的更多相关文章

  1. vue.js组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...

  2. ReactNative新手学习之路04 组件化开发轮播图swiper支持安卓和IOS

    react native 新手之路04 组件化开发轮播图swiper支持安卓和IOS npm install react-native-carousel --save git 地址Properties ...

  3. Webpack+Vue+ES6 前端组件化开发mobile-multi-page应用实战总结

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.写在前面 项目上线有一段时间了,一个基于webpack+vue+ES6的手机端多页面应用 ...

  4. Android组件化开发的简单应用

    组件化开发的主要步骤: 一.新建Modules 1.新建Project,作为应用的主Module. 2.新建Module:"Common",类型选择"Android Li ...

  5. 前端笔记之JavaScript面向对象(四)组件化开发&轮播图|俄罗斯方块实战

    一.组件化开发 1.1组件化概述 页面特效的制作,特别需要HTML.CSS有固定的布局,所以说现在越来越流行组件开发的模式,就是用JS写一个类,当你实例化这个类的时候,页面上的效果布局也能自动完成. ...

  6. vue(9)—— 组件化开发 - webpack(3)

    前面两个终于把webpack相关配置解析完了.现在终于进入vue的开发了 vue组件化开发预热 前期准备 创建如下项目: app.js: footer.js: main.js: webpack.con ...

  7. vue(8)—— 组件化开发 - webpack(2)

    webpack的常用loder和插件 loder和插件是什么,现在暂且不表,看到后面你就懂了 引入css问题 直接用link标签导入css 在前面的 vue(7)—— 组件化开发 — webpack( ...

  8. AppBoxFuture(六): 前端组件化开发

      前面几篇都是在介绍结构化与非结构化的数据存储,本篇换换口味介绍一下框架是如何实现前端组件化开发的.首先得感谢Vue.ElementUI等优秀的前端开源项目,这些项目帮助作者快速实现了框架的两个前端 ...

  9. 如何理解Unity组件化开发模式

    Unity的开发模式核心:节点和组件,组件可以加载到任何节点上,每个组件都有 gameobject 属性,可以通过这个属性获取到该节点,即游戏物体. 也就是说游戏物体由节点和组件构成,每个组件表示物体 ...

  10. Android项目实战(四十八):架构之组件化开发

    什么要组件化开发? 看一下普通项目的结构 , 一个项目下有多个Module(左侧图黑体目录),但是只有一个application,0个或多个library(在每个medel下的build.gradle ...

随机推荐

  1. SVN 使用

    我是一个前端,svn 的服务器配置也是后端弄好的,到底怎么弄的不清楚. 最开始是想和xcode关联起来,每次提交代码也方便,但是在Xcode里的偏好设置Accounts 模块 添加了SVN 服务端地址 ...

  2. 关于python的最大递归层数详解

    在阅读http://www.cnblogs.com/skabyy/p/3451780.html这篇文章的时候,实验yield的流式迭代素数的时候发现有个问题,故详细记录下来. 首先来看看python默 ...

  3. WebKit技术内幕

    WebKit技术内幕(浏览器内核|渲染引擎| HTML5| Chromium项目Committer重磅作品) 朱永盛 著   ISBN 978-7-121-22964-0 2014年6月出版 定价:7 ...

  4. C#设计模式-工厂模式

    引入人.工厂.和斧子的问题 原始社会时,劳动社会基本没有分工,需要斧子的人(调用者)只好自己去磨一把斧子,每个人拥有自己的斧子,如果把大家的石斧改为铁斧,需要每个人都要学会磨铁斧的本领,工作效率极低. ...

  5. writing-mode改变文字书写方式

    古代书写方式都是垂直方向上的,如果要实现这种效果的话,还是挺麻烦的,不过现在CSS3有一个"writing-mode"属性,它可以改变文字的书写方式. writing-mode:h ...

  6. poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)

    1 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> ...

  7. 基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理

    在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能给系统用户更好的操作体验,也提高了用户录入数据的效率.我在较早时期的EasyUI的Web框架上, ...

  8. 精选12个时尚的 CSS3 效果【附源码下载】

    这里是精选的12个很炫的 CSS3 效果.CSS3 是对 CSS 规范的一个很大的改善和增强,它使得 Web 开发人员可以很容易的在网站中加入时尚的效果.以前很多需要编写复杂的 JavaScript ...

  9. 在Spring Boot中使用Https

    本文介绍如何在Spring Boot中,使用Https提供服务,并将Http请求自动重定向到Https. Https证书 巧妇难为无米之炊,开始的开始,要先取得Https证书.你可以向证书机构申请证书 ...

  10. 【知识积累】爬虫之网页乱码解决方法(gb2312 -> utf-8)

    前言 今天在测试爬虫项目时,发现了一个很严肃的问题,当爬取的网页编码格式为gb2312时,按照一般的办法转化为utf-8编码时总是乱码,PS:爬取的所有网页无论何种编码格式,都转化为utf-8格式进行 ...