# wshore **Repository Path**: linzhv/wshore ## Basic Information - **Project Name**: wshore - **Description**: No description available - **Primary Language**: PHP - **License**: GPL-3.0 - **Default Branch**: v5 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-07-22 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # wshore - PHP轻框架 15年的时候在看过一部分ThinkPHP3.2.3的部分源码后了解到框架的实质是: **映射URL地址到控制器的方法** 建立了这样的映射关系后php应用的开发过程会变得条理清晰 --- ##### 处理过程 (process) 框架最基本的执行步骤分为两步: - 解析URL得到控制器(controller)和操作(action/method) - 实例化控制器并调用控制器下的操作 --- ##### 功能点(feature): 而为了提高开发的便捷性,框架通常捆绑了很多 - 类自动加载(autoload) : 免去大量include_once的痛苦 - 数据库模型(Model),ORM特性(包括ActiveRecord) : 提供了数据库操作的途径 - MVC结构 : Model(模型)和Controller(控制器)前面提到过了,View(视图)则使得表现层从数据和业务的泥潭中分离 - 常量定义 : 当前目录,URL,访问的控制器等信息在一次请求中是固定的一个值,可以直接通过框架预设的常量直接获取它的值,而不是再去写代码获取 - 工具类 : 例如ThinkPHP提供了验证码类库,可以通过很简单的方式进行调用,而不必再去网上找到代码或者自己造轮子 --- ##### wshore的功能点 ThinkPHP的URL解析可以得到模块(Module),控制器(Controller),操作(Action) wshore在ThinkPHP的基础上增加或修改了**空模块**,**多模块**,**子模块**的概念 ###### 多模块 例如: 当你访问的URL是**http://host.com/home/article/getlist?param=1** 那么URL解析时拿到的pathinfo是/home/article/getlist,然后按**"/"**分割得到下面的数组 ```php [ 'home', 'article', 'getlist', ] ``` 首先将最后一个元素弹出(array_pop)数组,得到了操作** Action = 'getlist'** 之后再弹出最后一个元素,得到了控制器 ** Controller = 'article' ** 最后将剩下的数组合并(implode),得到了模块 ** Module = 'home' ** 多模块的概念和ThinkPHP中的**模块分组**可以说完全一致 ###### 空模块 当你访问的URL是**http://host.com/article/getlist?param=1** 那么URL解析时拿到的pathinfo是/article/getlist,然后按**"/"**分割得到下面的数组 ```php [ 'article', 'getlist', ] ``` 按照前面的步骤分别得到了 - 操作** Action = 'getlist'** - 控制器 ** Controller = 'article' ** - 模块 ** Module = '' ** 可以看到模块是一段空字符串! 实际的业务场景中可以用作共享模块,或者一个控制器很难断定它应该属于哪个模块时,可以设置为空模块. 实际上空模块相当于ThinkPHP中禁止了**模块分组** ###### 子模块 当你访问的URL是**http://host.com/admin/mobile/article/getlist?param=1** 那么URL解析时拿到的pathinfo是/admin/mobile/article/getlist,然后按**"/"**分割得到下面的数组 ```php [ 'admin', 'mobile', 'article', 'getlist', ] ``` 按照前面的步骤分别得到了 - 操作** Action = 'getlist'** - 控制器 ** Controller = 'article' ** - 模块 ** Module = 'admin/mobile' ** mobile模块可以认为是admin模块的**子模块**,他们存在着嵌套关系,同样mobile模块还可以有子摸快,URL长度允许的前提下,你可以嵌套任意层级的 如果阅读过ThinkPHP源码,或许会发现wshore将pathinfo解析的过程和ThinkPHP相反: - ThinkPHP按照**模块->控制器->操作**(开启模块分组的前提下)先断定模块,遇到空的使用默认 - wshore按照**操作->控制器->模块**的顺序先后断定,遇到空的使用默认 按wshore的解析步骤,开发者可以更灵活地对应用模块进行合理布局,而不需要任何配置 Tip: - 如果想要一个控制器不被访问,可以将这个控制器声明为抽象类 --- ##### 其他 详细的文档(markdown格式)请见**gitbook**文件夹 至于**wshore**名称的具体意义,你可以理解为 **wshore = web + shore**