V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiangdong1987
V2EX  ›  PHP

PHP 组件化实践

  •  
  •   xiangdong1987 · 2019-05-28 19:27:45 +08:00 · 5337 次点击
    这是一个创建于 1999 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近学习了 go 语言,非常钦佩它从语言上对于 Coder 的友好化,对于它的包规划也感到很用心,其实做为一个 phper,我们 php 也是有很好的工具的,那就是 composer,它同样起到了规范化和组件化的作用。一个人的作用总归是有限的,只有集合广大人民的力量才是正道。

    实践过程

    1. 组件化什么?
      • 我一直有个想法做一套后台组件,能快速拼装后台功能,对于一些开源组件,内部实现复杂,自定义困难。所以想自己实现一套可复用的后台组件。 方便以后的开发。
    2. 如何实现组件化?
      • 对于 php 来说,composer 是不二选择,规范的定义,简单的维护,版本控制,大大减少心理负担。
    3. 如何定义自己的 composer 组件?
      1. 实现自己的组件

      2. 上传 github

      3. 定义 composer.json

        {
          "name": "xdd/x-template",    //包名  必须是二级的
          "description": "后台模板组件",
          "license": "MIT",
          "authors": [
            {
              "name": "xdd",
              "email": "[email protected]"
            }
          ],
          "autoload": {
            "psr-4": {
              "Component\\": "src/component",    //命名空间目录
              "Interfaces\\": "src/interface"          //命名空间目录
            }
          },
          "require": {}
        }
        
      4. 在 packagist 检出自己的 github 就完成了一个自己的 composer

      5. composer 版本是根据 github 的 tag 来创建的只需要给 github 打版本标签即可。

    根据上面的步骤可以轻松完成组件化 我实现的后台组件模块化 https://github.com/xiangdong1987/xTemplate 希望大家来贡献代码

    总结

    作为一个特别懒的程序员,如何把一个复杂重复的工作,做的有趣和简单是我唯一能促使我不断写代码的唯一动力。

    21 条回复    2019-06-19 08:54:40 +08:00
    HiCode
        1
    HiCode  
       2019-05-28 20:32:56 +08:00
    关注。

    我在自己开发的 php 系统里面,也做了类似的功能,不过我的思路是:根据配置数组渲染页面。

    我这个思路的弊端是缺乏足够灵活性(好在我的项目对后台页面要求不高,都是基本的查看编辑),但如果要按 组件 /类
    的方式通过 php 代码调用去生成页面,那我还不如直接写 html 好了。

    目前,前后端分离开始流行,我已经准备放弃后台系统由 php 渲染页面的做法了,后端负责接口只输出 json。

    不过还是很期待楼主提供的思路及方案。
    Caballarii
        2
    Caballarii  
       2019-05-28 20:43:44 +08:00
    WebForm 吗。。。
    jry
        3
    jry  
       2019-05-28 20:45:37 +08:00 via iPhone
    @HiCode 看看我的 initadmin,后端生成 json,json 由云后台自动解析生成页面。
    HiCode
        4
    HiCode  
       2019-05-28 22:27:15 +08:00
    @jry 我参考一下,我目前的思路跟 initadmin 思路很接近。
    xiangdong1987
        5
    xiangdong1987  
    OP
       2019-05-29 09:33:37 +08:00
    @HiCode 主要是减少重复工作,对于我们写 curd 来说,随便找个 js 组件封装的成本还是不高的,我的思路就是利用一些开源的 js 组件封装,实现简单化的拼装,我主要是利用了装饰器的设计模式,来做了一个,本来我这个可以链式调用的,后来同事给出说要是能自己拼装就好了,最后我优化成自动拼装了,你可以去看看我的项目,如果有什么建议和改进还请提给我。
    xiangdong1987
        6
    xiangdong1987  
    OP
       2019-05-29 09:44:31 +08:00
    @Caballarii 不知道 webForm 是何物 哈哈 框架用的少 不喜欢框架那种约束感,不太喜欢黑盒
    thesharjah
        7
    thesharjah  
       2019-05-29 11:15:32 +08:00   ❤️ 1
    HiCode
        8
    HiCode  
       2019-05-29 11:24:40 +08:00
    @xiangdong1987 好的,支持继续完善!
    HiCode
        9
    HiCode  
       2019-05-29 11:45:28 +08:00
    @thesharjah 感谢分享,非常棒的一个项目!
    ben1024
        10
    ben1024  
       2019-05-29 12:47:51 +08:00
    blade / Twig 可以考虑引入下
    xiangdong1987
        11
    xiangdong1987  
    OP
       2019-05-29 17:19:30 +08:00
    @ben1024 很有启发我研究一下 非常感谢
    xiangdong1987
        12
    xiangdong1987  
    OP
       2019-05-29 17:20:21 +08:00
    @thesharjah 看到 npm 就怕了 哈哈 不是专业前端就一个 phper,很怕前端这些工具
    simonlu9
        13
    simonlu9  
       2019-05-30 12:30:39 +08:00
    刚有这个想法,之前接了一个小程序做,发觉找个比较好用的后台基本上没有,后来找了一个 yii 的后台管理,还算可以,开发过程中发觉很多都是都可以造轮子,比如权限菜单管理,常规的地址信息管理,幻灯片轮播,单页内容,通用的 ui 组件,其实耗费时间的都是表单 curd 这种操作,yii 其实有一套 gii,能生成基本的表单,可是支持的业务组件不是很多,比如手机短信验证码这种,所以一些常规的业务可以抽象出来,做成一个通用的,也是基于 composer,我觉得 lz 可以参考这块来做,组一个云平台的表单组件,我们平时配置下就很方便,不用太关注前端的东西啦
    xiangdong1987
        14
    xiangdong1987  
    OP
       2019-05-31 09:33:20 +08:00
    @simonlu9 非常欢迎你去我的 github 上提 pr 一起开发,有好的想法也可以一起讨论
    siganushka
        15
    siganushka  
       2019-05-31 18:10:46 +08:00   ❤️ 1
    Symfony Bundle 系统就是实现你这种需求的最佳实践(独立可复用的 配置、业务逻辑、模型、模板等),你说的这些用类似 SonataAdminBundle 或者 EasyAdminBundle 就可以实现,但最终到具体项目的时候,也会随着项目的复杂度,配置参数变得越来越难维护,最终还是回到了抽象和具象的取舍的问题。
    xiangdong1987
        16
    xiangdong1987  
    OP
       2019-06-01 10:17:31 +08:00
    @siganushka 感谢兄弟,又让我看到了一些新的思路,我看到了一下这些 bundle,感觉确实可以实现这种模板生成,但是他们的封装还是太深了点,我其实就像做到了一个 php 和 js 前端框架的封装,让我们使用 js 的插件框架更简单,也不用重复造轮子,我这套是可以继承在任何 php 的框架下的 并不做深层封住,制作对 js 控件的封装。我非常同意随着业务的变化后台逻辑是没有一个固定的模型的,但是前端显示是可以组装的,前端并不关心逻辑,只做显示即可。我的想法是这个样子,期待更多的建议
    asdcs16
        17
    asdcs16  
       2019-06-04 19:18:37 +08:00 via Android
    你说的这个,难道 symfony 不是现成的
    HiCode
        18
    HiCode  
       2019-06-10 10:57:36 +08:00
    @xiangdong1987 要不组个 微信 /QQ 群讨论一下?我觉得我们可以先罗列目前已有的各种方案,看看有什么好的参考思路。
    dvaknheo
        19
    dvaknheo  
       2019-06-10 23:00:07 +08:00
    这个配置可能开发者最经常不注意。

    "repositories": [
    {
    "type": "vcs",
    "url": "/mnt/d/MyWork/sites/MyLibWithGit"
    }
    ]
    xiangdong1987
        20
    xiangdong1987  
    OP
       2019-06-18 15:36:14 +08:00
    @asdcs16 其实后台开发很多封装有点过于死板 不能实现一些奇葩前端需求,而一些好的 js 框架用起来也需要学习成本,我想封装一套 php + js 前端组件,让 phper 零成本使用 js 前端组件。可以看看我开源代码,你就明白了。
    asdcs16
        21
    asdcs16  
       2019-06-19 08:54:40 +08:00 via Android
    @xiangdong1987 基于 symfony 的 drupal8 已经实现了你说的,各种模块灵活组合,相互依赖作用,可以形成复杂的功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2566 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:41 · PVG 10:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.