GelyIan

GelyIan 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

coding my life

个人动态

GelyIan 关注了专栏 · 2018-01-25

Swoole

PHP的协程框架

关注 5387

GelyIan 赞了文章 · 2017-11-02

这两年多我写PHP业务代码的方式是如何进化的

曾今

谁都有过迷茫期,下面是我开始PHP开发中,不断改变的代码组织方式。

  • 初期:所有代码一股脑控制器controller

    • 曾今只是简单的理解MVC
  • 中期:业务代码抽象一部分到模型层model

    • 开始觉得model层是否该做点什么了
  • 后期:业务代码控制器,模型层只写db的curd方法

    • 复杂的业务代码使controller过于的庞大和难以维护

当下

汲取以前的码码体验,我目前的码码方式做了如下改变:

更合理的分层

  • 控制器暴露资源
  • 业务代码到逻辑层
  • 模型层只写db的curd方法

度的把握,凡事都是灵活的,也不都是这样,认为足够简单的逻辑还是“业务代码控制器,模型层只写db的curd方法”。

依赖注入,懒加载,前置中间件

  • 依赖注入容器很重要,配上懒加载,减少代码,解耦依赖,提升性能

  • 前置中间件注入我们依赖的类

组件化代码

首先我们需要利用composer来拆分和组件化我们的代码,业务中简单的composer require即可复用我们的业务代码。但是有一个问题如果使用 https://packagist.org 需要把代码开源出去,和业务无关的工具类还好说,而且开源还是个好事情,但是和业务相关比较敏感的组件就有问题了,所以我们需要搭建一个私有的packagist, 私有packagist示例:http://packagist.tigerb.cn/,具体搭建步骤见文末。

总结

目前让我接手一个项目我会从如下几个方面去组织我的php代码:

  • composer组件化代码,依赖开源或私有packagist
  • 前置中间件懒加载的方式依赖注入composer require的组件
  • 控制器暴露资源

    • 优雅的参数校验工具类
    • 使用try...catch...finally...
    • 响应尽可能的符合restful思想,比如error code:400,404,500...
  • 业务代码到逻辑层(也不一定)

  • 模型层只写db的curd方法

    • 不可撼动的原则

结语

不足还有很多,在这里只是把自己的想法分享出来,好的大家可以借鉴,不好的希望大家多多指正。

THX~

附录

Satis搭建私有的packagist过程,安装步骤如下:

step 1:

composer create-project composer/satis:dev-master --keep-vcs && cd satis

step 2:

touch satis.json

satis.json文件的内容如下

{
  "name": "packaglist-tigerb",
  "homepage": "http://packaglist.tigerb.cn",
  "repositories": [
    { "type": "vcs", "url": "http://github.com/tigerb/easy-mipush" },
    { "type": "vcs", "url": "http://github.com/easy-framework/easy-router"}
  ],
  "require-all": true
}

step 3:

php bin/satis build ./satis.json <你的web servser项目目录,比如我的路径/mnt/www>

step 4:

配置nginx server 配置,重启nginx即可
如何使用?

简单的配置composer.json即可,增加新的repositories地址,具体示例配置如下:

{
    "name": "tigerb/test",
    "authors": [
        {
            "name": "TIGERB",
            "email": "tigerbcode@gmail.com"
        }
    ],
    "repositories":[
        {"type":"composer", "url": "http://packagist.tigerb.cn"}
    ],
    "config": {
        "secure-http": false
    },
    "require": {
        "tigerb/easy-mipush": "^0.1.0"
    }
}

扫面下方二维码关注我的技术公众号,及时为大家推送我的原创技术分享

图片描述

查看原文

赞 53 收藏 154 评论 24

GelyIan 赞了文章 · 2017-10-29

Laravel 菜鸟晋级之路

用Laravel也有三四个月了,虽然是兼职开发,但是使用的频率非常之高,毕竟是产品化的一个项目。
在这期间,也踩了无数的坑,走了很多弯路,所以准备把最近的感悟记录下来,方便后来者。


第一阶段:简单的增删改查

这是最开始接触Laravel的一个阶段。如果有PHP经验,那么应该能很快找到MVC的路径,然后驾轻就熟的开始写起来。虽然还显得有些笨拙,不过很快就能做出一些内容了。如果没有PHP经验,还是不建议轻易入坑的。毕竟连语法都不熟悉,很难上手。

Laravel由于支持大量的命令行生成代码,可能对于thinkPHP或者其他框架的用户并不太友好,不过当你需要创建大量文件的时候,还是会觉得很好用的。即使是简单的增删改查,也建议多用命令行,比如最好用的php artisan make:model Foo -m,直接创建了model和对应的migration。

第二阶段:数据库factory和seeder

开发了比较多的功能之后,会发现需要大量的测试数据,这时候factory和seeder就该大显身手了。当然这两个货并不怎么好搞定,faker的功能非常之多,factory中创建各种faker,然后在seeder中调用,学会这些,你就又升了一级。

faker对中文支持也很好,可以生成用户名,英文名,中文名,中文公司名,中文的企业口号,大陆电话号码等。
数据填充的文档
faker的文档

第三阶段:表单剥离

最开始表单校验都是直接写在controller中,如果了解一下request相关的内容,可以将表单验证和数据创建更新,都放在单独的request类中,php artisan make:request FooForm即可创建一个表单验证器。我的习惯是,把新建和更新的验证,都写在一起,这样方便对照,以免出错。

表单类支持自动验证登录,自动验证规则,支持很多种规则还支持自定义规则(php artisan make:rules balabala),还可以用messages函数,返回自定义错误信息。
表单相关的文档

第四阶段:自动化测试

Laravel从5.5才开始支持浏览器自动化测试dusk,不过功能直接就登峰造极了,各种assert让你眼花缭乱,而且易用性也在我用过的各种浏览器测试框架中首屈一指。如果没有接触过自动化测试或者浏览器测试,建议先尝试一下其他框架,python、nodejs也都是有这方面工具的,做http测试和浏览器什么的。传统的人工测试,实在有点落后了。

dusk最好用的,一个是支持分页,也就是把一部分内容抽象到单独的类里面;还有一个是有好多内置函数,不需要写一大堆选择器,比如type输入可以使用input的名字,press使用button的名字,clickLink使用链接的名字,还能自定义高级选择器;另一个是遇到错误可以自动截图,简直是神操作,可以直观看到出错的页面。
测试相关的文档

第五阶段:设计模式

我目前刚达到这一阶段,今天才刚刚理解依赖注入的用法,才开始用上repository模式,之前数次重构,都没有成功。Laravel真正的神奇之处就在这里,你可以在controller之外的地方注入request对象,从而把大量的逻辑都从controller和model中剥离出来。在这之前的一阵子,我一直在用presenter模式,把视图中涉及到一些逻辑的代码都提取出来,以便复用。

项目越来越大之后,MVC已经完全不够用了,controller乱成一团,model里也有好多逻辑代码,view里有很多判断和计算。这时候就需要好好设计一下骨架了,比如presenter、repository等,service模式还没用过,后续可能会使用吧。
Laravel中大型项目架构

查看原文

赞 6 收藏 50 评论 2

GelyIan 关注了用户 · 2017-10-25

韩天峰 @hantianfeng

Swoole 开源项目创始人

关注 3097

GelyIan 关注了用户 · 2017-09-28

花裤衩 @panjiachen

show me the code

关注 2552

GelyIan 关注了用户 · 2017-09-27

周梦康 @zhoumengkang

  1. 高质量的付费直播 点击查看 跳槽加薪必看
  2. 关注微博 第一时间免费直播通知
  3. 实在不想付费,可以看我博客 https://mengkang.net

关注 2167

GelyIan 赞了文章 · 2017-08-11

js,jQuery获取html5的data-*属性

今天做项目的时候发现一个坑,关于jQuery获取data-*属性的方法data(),特写此篇来记录。

data-*自定义数据属性

HTML5规定可以为元素添加非标准型的属性,只需添加前缀data-,这些属性可以随意添加,随意命名,目的是为元素提供与渲染无关的信息,或提供语义信息。

js获取data-*的方式

  • 通过dataset属性访问

    //HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj"></div>

    //js代码
    var div = document.getElementById("myDiv");
    var appId = div.dataset.appid;//获取data-appid的值
    var myName = div.dataset.myname;//获取data-myname的值
    //设置值
    div.dataset.appid = 456;
    div.dataset.myname = "newname";

    //最终HTML结果
    <div id="myDiv" data-appid="456" data-myname="newname"></div>

dataset属性的值是DOMStringMap的一个实例,名值对的映射。每个data-name形式的属性都有一个对应的属性,只不过该属性名没有data-前缀。

兼容性:

clipboard.png

需要注意的是,dataset中大小写的问题。带连字符连接的名称在使用的时候需要命名驼峰化。例如data-my-name对应的是dataset.myName的值。可看以下代码

//将上面代码的设置值部分进行修改
 div.dataset.appId = 789;
 div.dataset.myName = "secondname";
 
 //最终结果
 <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

clipboard.png

  • 传统获取方式 `getAttribute

    还是上述的例子。获取data-*的方法可使用如下方法:

    var appId = div.getAttribute("data-appid");

jQuery获取方法

  • data()方法

    //HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

    //获取属性
    var appid = $("#myDiv").data("appid"); //123
    var app-id = $("#myDiv").data("app-id"); //456

    //属性赋值
    $("#myDiv").data("appid","666");

    //最终HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

需要注意的是,data()的值进行修改并不会影响到DOM元素上的data-*属性的改变。data()的本质其实是将一个 “cache” 附加到了对象上,并使用了一个特殊的属性名称。

所以上述代码中,虽然对div进行了data()赋值操作,但HTML代码中div的data-appid的值仍然为123,因为data()只是修改了缓存的那个值,此时进行$('#myDiv').data("appid")的操作,输出的结果为666.

  • attr()方法

    var appid = $("#myDiv").attr("data-appid");

参考资料:

查看原文

赞 5 收藏 20 评论 3

GelyIan 赞了文章 · 2017-08-11

js,jQuery获取html5的data-*属性

今天做项目的时候发现一个坑,关于jQuery获取data-*属性的方法data(),特写此篇来记录。

data-*自定义数据属性

HTML5规定可以为元素添加非标准型的属性,只需添加前缀data-,这些属性可以随意添加,随意命名,目的是为元素提供与渲染无关的信息,或提供语义信息。

js获取data-*的方式

  • 通过dataset属性访问

    //HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj"></div>

    //js代码
    var div = document.getElementById("myDiv");
    var appId = div.dataset.appid;//获取data-appid的值
    var myName = div.dataset.myname;//获取data-myname的值
    //设置值
    div.dataset.appid = 456;
    div.dataset.myname = "newname";

    //最终HTML结果
    <div id="myDiv" data-appid="456" data-myname="newname"></div>

dataset属性的值是DOMStringMap的一个实例,名值对的映射。每个data-name形式的属性都有一个对应的属性,只不过该属性名没有data-前缀。

兼容性:

clipboard.png

需要注意的是,dataset中大小写的问题。带连字符连接的名称在使用的时候需要命名驼峰化。例如data-my-name对应的是dataset.myName的值。可看以下代码

//将上面代码的设置值部分进行修改
 div.dataset.appId = 789;
 div.dataset.myName = "secondname";
 
 //最终结果
 <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

clipboard.png

  • 传统获取方式 `getAttribute

    还是上述的例子。获取data-*的方法可使用如下方法:

    var appId = div.getAttribute("data-appid");

jQuery获取方法

  • data()方法

    //HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

    //获取属性
    var appid = $("#myDiv").data("appid"); //123
    var app-id = $("#myDiv").data("app-id"); //456

    //属性赋值
    $("#myDiv").data("appid","666");

    //最终HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

需要注意的是,data()的值进行修改并不会影响到DOM元素上的data-*属性的改变。data()的本质其实是将一个 “cache” 附加到了对象上,并使用了一个特殊的属性名称。

所以上述代码中,虽然对div进行了data()赋值操作,但HTML代码中div的data-appid的值仍然为123,因为data()只是修改了缓存的那个值,此时进行$('#myDiv').data("appid")的操作,输出的结果为666.

  • attr()方法

    var appid = $("#myDiv").attr("data-appid");

参考资料:

查看原文

赞 5 收藏 20 评论 3

GelyIan 赞了文章 · 2017-08-11

js,jQuery获取html5的data-*属性

今天做项目的时候发现一个坑,关于jQuery获取data-*属性的方法data(),特写此篇来记录。

data-*自定义数据属性

HTML5规定可以为元素添加非标准型的属性,只需添加前缀data-,这些属性可以随意添加,随意命名,目的是为元素提供与渲染无关的信息,或提供语义信息。

js获取data-*的方式

  • 通过dataset属性访问

    //HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj"></div>

    //js代码
    var div = document.getElementById("myDiv");
    var appId = div.dataset.appid;//获取data-appid的值
    var myName = div.dataset.myname;//获取data-myname的值
    //设置值
    div.dataset.appid = 456;
    div.dataset.myname = "newname";

    //最终HTML结果
    <div id="myDiv" data-appid="456" data-myname="newname"></div>

dataset属性的值是DOMStringMap的一个实例,名值对的映射。每个data-name形式的属性都有一个对应的属性,只不过该属性名没有data-前缀。

兼容性:

clipboard.png

需要注意的是,dataset中大小写的问题。带连字符连接的名称在使用的时候需要命名驼峰化。例如data-my-name对应的是dataset.myName的值。可看以下代码

//将上面代码的设置值部分进行修改
 div.dataset.appId = 789;
 div.dataset.myName = "secondname";
 
 //最终结果
 <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

clipboard.png

  • 传统获取方式 `getAttribute

    还是上述的例子。获取data-*的方法可使用如下方法:

    var appId = div.getAttribute("data-appid");

jQuery获取方法

  • data()方法

    //HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

    //获取属性
    var appid = $("#myDiv").data("appid"); //123
    var app-id = $("#myDiv").data("app-id"); //456

    //属性赋值
    $("#myDiv").data("appid","666");

    //最终HTML代码
    <div id="myDiv" data-appid="123" data-myname="lsxj" data-app-id="456" data-my-name="secondname"></div>

需要注意的是,data()的值进行修改并不会影响到DOM元素上的data-*属性的改变。data()的本质其实是将一个 “cache” 附加到了对象上,并使用了一个特殊的属性名称。

所以上述代码中,虽然对div进行了data()赋值操作,但HTML代码中div的data-appid的值仍然为123,因为data()只是修改了缓存的那个值,此时进行$('#myDiv').data("appid")的操作,输出的结果为666.

  • attr()方法

    var appid = $("#myDiv").attr("data-appid");

参考资料:

查看原文

赞 5 收藏 20 评论 3

认证与成就

  • 获得 9 次点赞
  • 获得 4 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 4 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2014-09-20
个人主页被 228 人浏览