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

PHP 组件化实践

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

    最近学习了 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
    Q4h7388nR28s95fa
        1
    Q4h7388nR28s95fa  
       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 由云后台自动解析生成页面。
    Q4h7388nR28s95fa
        4
    Q4h7388nR28s95fa  
       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
    Q4h7388nR28s95fa
        8
    Q4h7388nR28s95fa  
       2019-05-29 11:24:40 +08:00
    @xiangdong1987 好的,支持继续完善!
    Q4h7388nR28s95fa
        9
    Q4h7388nR28s95fa  
       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 不是现成的
    Q4h7388nR28s95fa
        18
    Q4h7388nR28s95fa  
       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     Solana     2249 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:30 PVG 09:30 LAX 17:30 JFK 20:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86