从零开始之ecshop基础篇(17)
目标:基于自定义的mvc框架开发的案例(项目)
项目周期 需求分析
典型的业务逻辑: 电子商务:商城(京东),B2C,C2C(淘宝),团购,秒杀,代购
内容管理:新浪门户类,优酷视频管理,博客文章管理,微博
论坛:
我们的需求,商品管理案例!参考ecshop应该出现的商品管理的基本功能实现。
安装ecshop
ecshop,使用率非常高,电子商务平台(网上商城系统)。
上传拷贝php源代码 创建数据 基本配置
下载ecshop的源代码,解压,将upload目录拷贝(上传)到web目录:建议改成ecshop的名字
使用浏览器,访问到ecshop目录中的index.php即可。自动跳转到安装界面(如果需要重新安装,也可以请求到该地址)
检查环境,典型的需要:mysql扩展,gd扩展(图片处理扩展)
1 |
extension=php_gd2.dll |
配置信息
数据库服务器部分:
管理员信息:
安装测试数据:
等待安装完毕:
Tips:建议选择PHP5.3X版本
设计
数据结构的设计
编码的设计
典型的编码,分成两大方向:二次开发,基于框架开发
二次开发:在已有的产品(业务逻辑都已经实现)上做修改,升级的开发方式。
优点:速度快,通用业务逻辑已经被实现。
缺点:定制型差。
典型的产品:
电子商务:ecshop,ecmall,shopex,zen-cart,oscommerce ,麦进斗
内容管理:dedecms,帝国cms,phpcms,drupal,wordpress
论坛:phpwind,discuz
框架开发:
框架,没有实现业务逻辑,只实现了底层代码。
优点:不用写重复的底层功能代码,直接用即可,定制性强。
缺点:周期较长。
典型的框架:ThinkPHP,Yii,Ci,Zend-framework,symphony
编码的实现 30%
测试,调试
上线,生产环境
升级,维护
HTML+PHP混编的编程方式
PHP代码与HTML代码 出现在同一文件中。
典型的是:
上面是PHP先实现所有的业务逻辑,下边再是HTML决定显示样式。
或者直接利用PHP echo ,输出需要的HTML代码。
PHP Code
1 |
echo '<table>'; |
显示与逻辑相分离
将负责数据处理,业务逻辑处理的PHP代码,与负责显示效果处理的HTML(CSS,JS)等分开来进行管理。
典型的实现:将负责显示的HTML相关部分,拆分到独立的HTML中,在PHP处理完业务逻辑后,再将HTML代码加载到该文件中。
简单的说就是把原来混编的代码分开到2个页面。这2个页面要组合起来才能实现和原来一个混编文件一样的效果。
比如:match_list.html(展示)match_list.php(逻辑) require './match_list.html';
什么是模板template
template:参见match_list.html
使用html相关代码负责显示结构,使用动态代码php实现数据的展示,该类型的文件,在项目中,称之为模板文件,template.
要求:浏览器用户请求,必须请求负责逻辑功能的PHP文件才可以。
如何限制浏览器用户不能请求到html模板文件?
典型的实现方式2种:
- 将不允许用户浏览器访问到的文件,直接放置在网站的文档根目录之外(常用)。
- 将所有的模板文件集中到摸个目录中,在利用Apache的对访问权限的控制,设置某些目录是不可以访问的。
典型的可以利用Apache的分布式配置文件.htaccess来实现。
一:利用Apache的主配置文件httpd.conf来开启某个目录的对.htaccess文件的支持
如下的配置段
<Directory>
1 |
#表示对htdocs这个目录进行配置 |
AllowOverride来允许目录中的.htaccess文件可用
1 |
#表示对htdocs这个目录进行配置 |
Tips:针对目录的设置,在当前目录及其后代目录都会生效。
二:利用.htaccess来设置目录的访问权限
在指定目录内,创建一个.htaccess templates目录内:增加Deny from All
1 |
.htaccess |
MVC的分层方式
场景:分析读取数据的部分,PHP的实现逻辑
典型的,数据的处理(增删改查),可能会在不同的业务逻辑中,反复的出现。应该将相同的数据处理部分,提取出来,需要的时候调用。
在业务逻辑处理,将数据处理的部分,单独拿出来。
PHP+HTML混编文件由HTML(显示部分)和PHP(业务逻辑部分)构成,业务逻辑部分又可以划分为业务流程和数据处理部分。
以上的项目的拆分分工方式称之为mvc的设计理想。
M:Model,模型,实现主要的业务逻辑,数据的处理
V: View,视图,主要负责显示部分
C:Controller,控制器,控制整体的流程进度
如果按照MVC来设计项目
用户浏览器去请求某个功能的控制器。
该控制还需要通过当前所要完成的功能,去调用模型来得到数据处理。
该控制还需要判断当前是否需要显示,去调用视图层模板来完成显示。
参考代码:控制(match_list.php)
1 |
<?php //需要比赛数据 //调用视图,显示结果 |
模型(match_data.php)
PHP Code
1 |
<?php //引入mysqldb类 |
视图(match_list.html)
PHP Code
1 |
<!-- 比赛列表的视图模板文件,view,视图层功能文件 --> |
分层的目的在于管理代码和代码重用。
mvc设计思想
mvc框架,基于mvc设计思想实现的框架,称之为MVC框架。
Model,模型部分
模型类
典型的模型的应该如何实现?
模型,完成主要的业务逻辑处理(数据的处理)
典型的模型时:为需要操作的每类数据表,会独立的建立一个模型类进行管理。
基于该表的每个操作,应该对当前模型类的一个方法。
PHP Code
1 |
<?php /** |
控制器中,需要得到模型对象,调用相应方法,才能获得相应数据。
PHP Code
1 |
<?php //需要比赛数据 //调用视图,显示结果 |
练习:删除比赛
增加一个链接请求到删除比赛的流程控制的控制器文件。
修改列表视图,template/match_list.html
PHP Code
1 |
<!-- 比赛列表的视图模板文件,view,视图层功能文件 --> <a href="match_del.php?id=<?php echo $row['match_id'];?>">删除</a>//增加删除链接 |
控制器
增加match_del.php控制器文件并完成相应功能的调用:
PHP Code
1 |
<?php //调用模型将数据删除 //调用视图展示删除结果(直接跳转到列表功能即可) |
模型
为MatchModel增加一个delById的方法
PHP Code
1 |
/** //删除语句 |
视图 该功能没有视图参与
基础模型类
为其他模型类提供基础代码的模型的基础类
Model.class.php
PHP Code
1 |
<?php |
其他模型类
PHP Code
1 |
<?php |
在基础模型类中,增加可以获得MySQLDB类对象的方法
PHP Code
1 |
<?php |
应该在每次实例化模型类对象时,就完成MySQLDB类对象的初始化工作。
增加基础模型类的构造方法:
在初始化mysqlDB类对象保存到当前的一个属性上,可以保证在模型对象中都可以使用该属性:
PHP Code
1 |
<?php |
模型中,使用$this->db即可操作到当前mysqlDB类对象。
PHP Code
1 |
//MatchModel.class.php //删除语句 |
最终结构模型:
view,视图层
利用模板引擎技术,搭建性能,语法更加快速,简洁的视图层语法。
Smarty,就是模板引擎技术
使用PHP的流程控制的标签语法,来完成模板部分
PHP Code
1 |
<?php if (!empty($rows)) :?> |
Controller,控制器
将同一个模块的操作,整理到一个控制器文件内,将控制器语法oop化
增加模块的控制器文件,module
PHP Code
1 |
<?php //比赛列表 //比赛删除 //其他比赛功能 |
一个文件多个功能,如何判断,当前用户浏览器,需要执行哪个功能?
要求用户在请求时,携带能够标识当前操作的参数才可以,入股没有参数,则认为是默认动作:
例如:
列表: match_controller.php?a=list
删除: match_controller.php?a=del
默认: match_controller.php?a=list
PHP Code
1 |
//先确定用户所传递的参数 |
判断action的值:
PHP Code
1 |
if ($action == 'list') { |
在相应的部分执行正确的控制器代码即可:
PHP Code
1 |
if ($action == 'list') { |
将来模板内生成的连接地址,就成为controller.php?a=action
1 |
//match_list.html //match_controller.php |
Tips:三个模块
模板(muban),Template,结构有html代码充当,而数据由动态代码(PHP)充当的负责展示文件。
模型(moxing),Model,mvc中负责处理数据,完成业务逻辑的部分
模块(mokuai),Module,几个相关的功能的集合,一个包含了多个动作的控制器文件。
控制器类
将模块的控制器类文件,由一个类的对象来实现。
结果:
模块控制器文件 控制器类文件
每个功能 控制器类一个方法
PHP Code
1 |
<?php |
实现原来的业务逻辑即可
现在的执行功能就是调用控制器对象的方法,如何调用?
实例化控制类对象,一句当前的请求参数调用对象方法。
增加一个额外的用于实例化控制器类对象的代码,调用控制器对象方法
入口文件
进入到项目内,使项目的代码可以运转起来
PHP Code
1 |
<?php |
练习,学生列表
控制器
增加一个学生管理模块的控制器类
内增加一个学生列表list功能
PHP Code
1 |
<?php |
PHP Code
1 |
<?php |
模型
增加一个学生模型类
StudentModel.class.php
PHP Code
1 |
<?php |
视图
增加学生类表模板文件
student_list.html
PHP Code
1 |
<h1>学生列表</h1> |
请求到该工作,则可以执行
增加一个入口文件
student.php
PHP Code
1 |
<?php |
单一入口
此时,会出现功能几乎完全一致,只有当前需要的控制器类不一样的入口文件。
使用一个入口文件,实现对所有的控制器类的加载,实例化工作(单一入口)
确定,入口文件需要的控制器类名即可,类似于参数a,在增加一个请求的参数c,表示,当前浏览器用户,需要看到的控制器名。
学生列表:index.php?c=Student&a=list
比赛列表: index.php?c=Match&a=del
入口文件的处理
PHP Code
1 |
<?php |
测试:localhost/six/index.php?c=Student&a=list localhost/six/index.php?c=Match&a=list
PHP Code
1 |
<a href="index.php?c=Match&a=del&id=<?php echo $row['match_id'];?>">删除</a> header('Location: index.php?c=Match&a=list'); |
强调:
有了单一入口,就要求,用户的所有的请求都要从单一入口文件请求到。
项目的布局
目录分成2个目录
体现框架代码和业务逻辑代码的区别
将基础模型,mysqlDB类定义文件放在框架代码:
将业务逻辑相应的控制器,模型,视图文件分别放在application目录中
入口文件,通常放置在站点根目录:
修改项目中使用的路径
PHP Code
1 |
目录结构
|
从零开始之ecshop基础篇(17)的更多相关文章
- 2000条你应知的WPF小姿势 基础篇<1-7>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...
- cocos2dx基础篇(17) 音乐音效SimpleAudioEngine
[3.x] (1)获取单例:sharedEngine() 改为 getInstance() (2)实现了:音量的调节. (3)修改了播放音效 playEffect() 的参数: ...
- 【Unity|C#】基础篇(17)——字符串处理(String/StringBuilder)
[学习资料] <C#图解教程>(第25章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...
- C#多线程之基础篇3
在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...
- 2000条你应知的WPF小姿势 基础篇<15-21>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...
- [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...
- 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)
http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...
- c# 扩展方法奇思妙用基础篇八:Distinct 扩展(转载)
转载地址:http://www.cnblogs.com/ldp615/archive/2011/08/01/distinct-entension.html 刚看了篇文章 <Linq的Distin ...
- DOM系列---基础篇
DOM系列---基础篇 DOM (Document Object Model) 即文档对象模型, 针对 HTML 和 XML 文档的 API (应用程序接口) .DOM 描绘了一个层次化的节点树, ...
随机推荐
- 山东省第六届ACM省赛
A.Nias and Tug-of-War(sort排序) B.Lowest Unique Price(set+map) C.Game!(博弈) D.Stars E.BIGZHUGOD and His ...
- NYOJ 49-开心的小明:01背包
点击打开链接 开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是 ...
- jQuery学习笔记----入门
基础语法是:$(selector).action() 美元符号定义 jQuery 选择符(selector)“查询”和“查找” HTML 元素 jQuery 的 action() 执行对元素的操作
- Android--输入自动提示AutoCompleteTextView
布局文件: <TextView android:id="@+id/title" android:layout_width="wrap_content" a ...
- 阿里RDS备份恢复
未使用root用户操作: 数据库版本要一致 数据目录:/data/mysqlbak/ 先按阿里给的步骤操作,最后出现一步出现,无法找到back_xxx.conf,但该文件已经存在.解决方法: sudo ...
- Hive参数层面常用优化
1.hive数据仓库权限问题: set hive.warehouse.subdir.inherit.perms=true; 2.HiveServer2的内存 连接的个数越多压力越大,可以加大内存:可以 ...
- 如何搭建maya plugin develop environment on MAC OS X
1.首先我使用的平台是xcode version 5.1.1 ,MAYA2015, MAX OS X 10.9.4. MAYA2015要求的是:Mountain Lion 10.8.5, Xcode ...
- css+js+html基础知识总结
css+js+html基础知识总结 一.CSS相关 1.css的盒子模型:IE盒子模型.标准W3C盒子模型: 2.CSS优先级机制: 选择器的优先权:!important>style(内联样式) ...
- 过河-状压DP
http://www.luogu.org/problem/show?pid=1052 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上 ...
- 【SSH 1】SSH框架的基本理解
导读:在结束了BS之后,接触到的第一个项目算是网上商城了.这次用到了和之前都不一样的框架:SSH.这个项目就和之前学牛腩一样,有着里程碑的意义.当然了,这也就意味着,什么都是新鲜的,接触到的东西,有时 ...