[Full-stack] 世上最好語言 - PHP

前言


本篇是對我的PHP, Laravel系列博文的總結與思考。php

目的在於理清並熟練以下過程:css

"需求 --> Usercase --> UI --> 框架 --> 開發"html

 

 

 

需求分析 


1、頁面初步設計

Ref: [Laravel] 06 - Project: from Usercase to Viewmysql

1. Pure html 寫法jquery

2. 找到其中的公共部分 --> blade模板laravel

3. 佈局設計css,bootstrap and jqueryweb

重難點也就是blade,以及bootstra p& jquery。sql

 

 

2、Common頁面模板設計

views -- common -- layouts.blade.php -- message.blade.php -- validator.blade.php

 

  • Layouts 核心模板

<head>數據庫

<title>輕鬆學會Laravel - @yield('title')</title>

</head>json

<body>

Ref: laravel 基礎教程 —— Blade 模板引擎【寫的不錯】 Ref: [Laravel] 04 - Blade templates【關鍵字的理解】

</body>

 

  • 佈局設計

 這部份內容請見:[Full-stack] 網頁佈局藝術 - Less

 

 

3、路由與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 設計


1、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; }
View Code

 

  • 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 } }

 

 

 2、緩存策略

  • 靜態緩存 與 mem緩存

Ref: [Laravel] 11 - WEB API : cache & timer 

此連接內容爲下面的緩存三種策略作鋪墊。

 

  • 緩衝方案

這裏以靜態緩衝做爲例子,僅考慮後兩種方案便可。

Goto: [Laravel] 12 - WEB API : cache implement

 

 

3、數據庫連接

須要複習一遍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);

 

 

4、版本檢查

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();

 

 

5、錯誤日誌 

攜帶設備信息 device id 的 request 發送到服務器端,

而後,服務器當作 error log 保存起來。

 

 

 

Maravel API 設計


1、前言

  • REST API

Goto: [Node.js] 08 - Web Server and REST API

  • Laravel API

Ref: https://laravel.com/docs/5.6

 

 

2、功能實現

  •  用戶註冊模塊

Goto: [Laravel] 14 - REST API: Laravel from scratch

 

  

3、單元測試

Goto: [Laravel] 15 - REST API: sidebar with unit test

 

 

 

附錄


1、PHP 參考手冊 

 

2、其餘經常使用函數

  • ucwords() 函數

把每一個單詞的首字符轉換爲大寫。

$resultClass = ucwords($type);
畢竟url中的參數不能使用大寫。
 
  • 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

相關文章
相關標籤/搜索