[Full-stack] 世上最好语言 - PHP
前言
本篇是对个人PHP, Laravel系列博文的总结与思考。
目的在于理清并熟练如下过程:
"需求 --> Usercase --> UI --> 框架 --> 开发"
需求分析
一、页面初步设计
Ref: [Laravel] 06 - Project: from Usercase to View
1. Pure html 写法
2. 找到其中的公共部分 --> blade模板
3. 布局设计css,bootstrap and jquery
重难点也就是blade,以及bootstra p& jquery。
二、Common页面模板设计
views -- common -- layouts.blade.php
-- message.blade.php
-- validator.blade.php
- Layouts 核心模板
<head>
<title>轻松学会Laravel - @yield('title')</title>
</head>
<body>
Ref: laravel 基础教程 —— Blade 模板引擎【写的不错】 Ref: [Laravel] 04 - Blade templates【关键字的理解】
</body>
- 布局设计
这部分内容请见:[Full-stack] 网页布局艺术 - Less
三、路由与MVC框架
- 有效路由 与 无效路由
无效路由:没有实际页面的路由,且request后,服务器会调用redirect重定向到一个有效路由对应的页面。
Route::group(['middleware' => ['web']], function () {
Route::get('student/index', ['uses' => 'StudentController@index' ]);
Route::any('student/create', ['uses' => 'StudentController@create']);
Route::any('student/save', ['uses' => 'StudentController@save' ]);
Route::any('student/update/{id}', ['uses' => 'StudentController@update']);
Route::any('student/detail/{id}', ['uses' => 'StudentController@detail']);
Route::any('student/delete/{id}', ['uses' => 'StudentController@delete']);
});
Ref: 路由相关概念:[Laravel] 02 - Route and MVC
- 模型 与 数据库
[1] 首先,pure php 是如何链接数据库的呢?
Goto: [PHP] 07 - Json, XML and MySQL
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB"; // 1.创建连接
$conn = new mysqli($servername, $username, $password, $dbname); // 2.检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 3.SQL操作
$sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')";
if ($conn->query($sql) === TRUE) {
echo "新记录插入成功";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
// 4.关闭连接
$conn->close();
?>
[2] Laravel 又是如何通过框架实现的呢?
Goto: [Laravel] 03 - DB facade, Query builder & Eloquent ORM
1. 原始方式
第一步,设置配置文件:[config/database.php]
第二步,执行sql语句。
use Illuminate\Support\Facades\DB
$students = DB::select('select * from student');
2. 查询构造器
3. Eloquent ORM - 对象关系映射(Object Relational Mapping,简称ORM)
- 路由 --> 控制器 (模型) --> 视图
[1] 路由 到 控制器
Route::any('student/create', ['uses' => 'StudentController@create']);
URL中参数解析:
(1) router 中获得已定义好的参数。[Laravel] 02 - Route and MVC
(2) controller 中通过request函数获得URL中key对应的value。[Laravel] 05 - Controller
[2] 控制器 with 模型 到 视图
// 添加页面
public function create(Request $request)
{
# 获得模型载体
$student = new Student(); if ($request->isMethod('POST')) { // 控制器验证 or Validator类验证
# 获取数据
$data = $request->input('Student');
# 载体加载了数据,数据库与载体数据同步
if (Student::create($data) ) {
return redirect('student/index')->with('success', '添加成功!');
} else {
return redirect()->back();
}
}
# 视图展示载体
return view('student.create', [
'student' => $student
]);
}
PHP API 设计
一、Pure PHP 封装接口
- 什么叫封装?
封装一个类,服务器端采用 response 处理以下内容。
| code | 返回的id,统一编号 |
| message | 具体解释,detail |
| data | 具体内容,参数 |
参数要数组化,构成 $result。
$result --> XML or JSON 格式
XML组装时需要一个递归的解析过程:
public static function xmlToEncode($data) {
$xml = $attr = "";
foreach( $data as $key => $value) {
if (is_numberic($key)) {
$attr = "id='{$key}'";
$key = "item";
# <item id=[key]>
}
$xml .= "<{$key}><{$attr}>";
$xml .= is_array($value) ? self::xmlToEncode($value) : $value;
$xml .= "</{$key}>";
}
return $xml;
}
- Response 封装
这里可以考虑使用工厂方法。
public static function show($code, $message='', $data=array(), $type=self::JSON) {
if(!is_numeric($code)) {
return '';
}
$type = isset($_GET['format']) ? $_GET['format'] : self::JSON;
$result = array(
'code' => $code,
'message' => $message,
'data' => $data,
);
/**
* 以下switch的写法,也可以写成工厂方法的形式,
*/
if($type == 'json') {
self::json($code, $message, $data);
exit;
} elseif($type == 'array') {
var_dump($result);
} elseif($type == 'xml') {
self::xmlEncode($code, $message, $data);
exit;
} else {
// TODO
}
}
二、缓存策略
静态缓存 与 mem缓存
Ref: [Laravel] 11 - WEB API : cache & timer
此链接内容为下面的缓存三种策略做铺垫。
- 缓冲方案
这里以静态缓冲作为例子,仅考虑后两种方案即可。
Goto: [Laravel] 12 - WEB API : cache implement
三、数据库链接
需要复习一遍sql语句:[Laravel] 16 - DB: Eloquent
# step 1, 语句编写
$sql = "select *
from `version_upgrade`
where app_id = " . $appId ."
and status = 1
limit 1";
# step 2,连接
$connect = Db::getInstance()->connect();
#step 3,执行语句
$result = mysql_query($sql, $connect);
#step 4,转化结果格式
mysql_fetch_assoc($result);
四、版本检查
Ref: [Laravel] 13 - WEB API : update & error tracking
<?php
require_once('./common.php'); class Init extends Common {
public function index() {
$this->check(); # check的实现,判断app的版本是否有问题
/**
* 1.获得手机信息,确认没有问题
* 2.该手机是否需要升级
* implement here.
*/
Response::show(number, '返回给app的一些信息');
}
}
-------------------------------------------
$init = new Init();
$init->index();
五、错误日志
携带设备信息 device id 的 request 发送到服务器端,
然后,服务器当做 error log 保存起来。
Maravel API 设计
一、前言
- REST API
Goto: [Node.js] 08 - Web Server and REST API
- Laravel API
Ref: https://laravel.com/docs/5.6
二、功能实现
- 用户注册模块
Goto: [Laravel] 14 - REST API: Laravel from scratch
三、单元测试
Goto: [Laravel] 15 - REST API: sidebar with unit test
附录
一、PHP 参考手册
二、其他常用函数
- ucwords() 函数
把每个单词的首字符转换为大写。
$resultClass = ucwords($type);
- dirname(__FILE__)
dirname(dirname(__FILE__));
假设__FILE__为 /home/web/config/config.php
上面的方法输出为 /home/web
- is_dir()
- file_put_contents()
<?php
echo file_put_contents("test.txt","Hello World. Testing!");
?>
- @unlink()
@ 作用就是:错了也不告诉你!骗你没商量
if(is_null($value)) {
return @unlink($filename);
}
- is_numeric($var)
常用于检查参数。
if(!is_numeric($appId) || !is_numeric($versionId)) {
return Response::show(401, '参数不合法');
}
- static::
Ref: PHP static关键字的用法及注意点
详见: [PHP] 02 - Namespace & Class
[Full-stack] 世上最好语言 - PHP的更多相关文章
- DSP中CMD文件
DSP中CMD文件 (2012-12-26 20:54:17) 转载▼ 标签: 杂谈 分类: DSP FPGA DSP的存储器的地址范围,CMD是主要是根据那个来编的.CMD 它是用来分配rom和ra ...
- [Code::Blocks] Install wxWidgets & openCV
The open source, cross platform, free C++ IDE. Code::Blocks is a free C++ IDE built to meet the most ...
- 第21月第4天 leetcode codinginterview c++
1.leetcode Implement strStr(). Returns the index of the first occurrence of needle in haystack, or - ...
- 本人SW知识体系导航 - Programming menu
将感悟心得记于此,重启程序员模式. js, py, c++, java, php 融汇之全栈系列 [Full-stack] 快速上手开发 - React [Full-stack] 状态管理技巧 - R ...
- Java Run-Time Data Areas
前言 本文主要介绍JVM的运行时数据区 来自Oracle文档 Java Virtual Machine Specification -- Chapter 2. The Structure of the ...
- java Vamei快速教程22 内存管理和垃圾回收
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 整个教程中已经不时的出现一些内存管理和垃圾回收的相关知识.这里进行一个小小的总结. ...
- 【Java】JMM内存模型和JVM内存结构
JMM内存模型和JVM内存结构 JAVA内存模型(Java Memory Model) Java内存模型,一般指的是JDK 5 开始使用的新的内存模型,主要由JSR-133: JavaTM Memor ...
- 【DSP开发】CMD文件
DSP的存储器的地址范围,CMD是主要是根据那个来编的. CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间. 所以不同的芯片就有不同大小的rom和ram.放用户程序的地方 ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
随机推荐
- 9、SQL逻辑查询语句执行顺序
本篇导航: SELECT语句关键字的定义顺序 SELECT语句关键字的执行顺序 准备表和数据 准备SQL逻辑查询测试语句 执行顺序分析 一.SELECT语句关键字的定义顺序 SELECT DISTIN ...
- Linux TC(Traffic Control)框架原理解析
近日的工作多多少少和Linux的流控有点关系.自打几年前知道有TC这么一个玩意儿而且多多少少理解了它的原理之后,我就没有再动过它,由于我不喜欢TC命令行,实在是太繁琐了.iptables命令行也比較繁 ...
- [转]delphi 有授权许可的字符串拷贝函数源码
一段看上去“貌不惊人”的Delphi插入汇编代码,却需要授权许可,但是与经典的同类型函数比较,确实“身手不凡”. 研究代码的目的在于借鉴,本文通过分析,并用C++重写代码进行比较,再次证明这段代码效率 ...
- 奇怪吸引子---NoseHoover
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- 【T07】不要低估tcp的性能
1.tcp在ip的基础上增加了校验和.可靠性和流量控制的功能,而udp只增加了校验和的功能,看起来udp应该会比tcp快很多, 但事实不是这样,有时候tcp比udp的性能还要好. 2.思考,在什么情况 ...
- Ubuntu下搭建tftp服务器最简单方法
今天开始调试ARM的板子,要通过tftp下载到板子上,所以又要配置tftp服务器,真的烦死了… (本人酷爱装系统,所以经常都要搞配置) 因为之前已经在Ubuntu下搭建过很多次tftp服务器了,但是一 ...
- win32 进程崩溃时禁止弹出错误对话框
在程序初始化的时候加入以下代码即可: SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); _set_abort_behav ...
- 实战c++中的vector系列--vector<unique_ptr<>>初始化(全部权转移)
C++11为我们提供了智能指针,给我们带来了非常多便利的地方. 那么假设把unique_ptr作为vector容器的元素呢? 形式如出一辙:vector<unique_ptr<int> ...
- ubuntu 16 安装 openjdk 8
apt--jdk -y 进行验证即可
- 物联网架构成长之路(24)-Docker练习之Compose容器编排
0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...
