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

一般我们常用的库是小而美,用的框架是大而全。从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组件化开发composer,PHP组件化开发 - JimmyJaw的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java实现gdal栅格矢量化_gdal栅格矢量化 - osc_lfs4vsih的个人空间 - OSCHINA - 中文开源技术交流社区...

    #include "gdal_alg.h" 栅格矢量化功能用于将栅格数据生成矢量数据,通常用于分类图像.GDAL库中使用函数GDALPolygonize()或者函数GDALFPol ...

  2. java关键字汉化_Java关键字 - 乱流的个人空间 - OSCHINA - 中文开源技术交流社区

    static关键字 (1)静态的意思.可以修饰成员变量和成员方法. (2)静态的特点: A:随着类的加载而加载 B:优先与对象存在 C:被类的所有对象共享 这其实也是我们判断该不该使用静态的依据. 举 ...

  3. php+fpm+加大request,php-fpm配置 - 小良下山化了个缘的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近项目发现服务器CPU在访问量大的时候飙升到98%,后台查看进程主要是PHP-fpm消耗内存 初学相关资料修改php-fpm配置 php-fpm.conf有两个重要的参数: pm.max_child ...

  4. java组件介绍_Java组件介绍 - osc_wws45aot的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.String string对象的不变性.被final关键字修饰. 使用charat方法替代startwith/endwith方法(提高性能) 使用buffer(方法同步,性能较差)和builder ...

  5. java中的轮子是什么意思_后端的轮子(一) - java后端开发的个人空间 - OSCHINA - 中文开源技术交流社区...

    前言 首先,看看这个,想必大家对下面这种简历看得比较多了吧? 精通JAVA,Python,熟练掌握C++ 精通Redis,Memcached,Mysql 精通Nginx配置,模块开发 精通Kafka, ...

  6. python语言是由谁设计并领导开发的_python语言概述 - osc_lt3ocv4d的个人空间 - OSCHINA - 中文开源技术交流社区...

    python语言的发展 python语言诞生于1990年,由Guide van Rossum设计并领导开发. python语言是开源项目的优秀代表,其解释器的全部代码都是开源的. 编写Hello程序 ...

  7. linux下安装EDK2开发环境,EDK2开发环境搭建 - osc_y9wmeuxa的个人空间 - OSCHINA - 中文开源技术交流社区...

    EDK2开发环境搭建 来源 https://blog.csdn.net/rikeyone/article/details/80759724 EDK2全称为"uEFI Development ...

  8. 文档上传下载 php开源,PHP文件的上传下载 - PHP开发学习门户的个人空间 - OSCHINA - 中文开源技术交流社区...

    (1).在标签中将enctype和method两个属性指明相应的值. Enctype="multipart/form-data"; Method="POST" ...

  9. python蓝牙上位机开发_python做上位机 - osc_2frv0wjp的个人空间 - OSCHINA - 中文开源技术交流社区...

    参考文章: https://blog.csdn.net/dgut_guangdian/article/details/78391270 https://www.cnblogs.com/lanceyu/ ...

最新文章

  1. java -d32_java11教程--JDK 10删除和不推荐的功能和选项-2
  2. JavaScript语义基础
  3. vue中config/index.js:配置的详细理解
  4. 【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现
  5. 我从AI For Everyone学到的十个重要AI 概念
  6. JSP ---- 入门
  7. 2万字硬核剖析网页自定义字体解析(css样式表解析、字体点阵图绘制与本地图像识别等)
  8. 机器学习中最常见的四种分类模型
  9. Windows SDK SignTool.exe 微软文件签名工具的使用
  10. C++ 输入输出加速挂(ACM竞赛常用)
  11. HDFS容错性设计有哪些?
  12. kappa一致性检验教程_诊断试验的一致性检验-Kappa
  13. 贴吧老矣,尚能饭否?
  14. 日常食物软分类与烹饪方法的思考——预防肥胖
  15. 华为MateBook电脑PAK-AL09救砖教程
  16. python url加密解密_python解密百度加密链接的脚本
  17. Seaborn(三)调色板palette
  18. 常见嵌入式WEB服务器
  19. Android开发随手记1
  20. clover写入efi_clover如何使用UEFI引导和EFI驱动选择

热门文章

  1. inotify结合rsync监控目录的实时变化
  2. linux系统启动流程详解
  3. mongodb 的PHP 扩展
  4. 【LeanEAP.NET】精益企业应用平台---源码Demo下载
  5. SQL Server 中数据查询注意事项
  6. python全栈脱产第25天------组合、多态、封装、property装饰器
  7. 【面试】上中断和下中断
  8. ES6新增特性——Promise
  9. MVCAction接收数据方式
  10. Please see the 'svn upgrade' command