[Laravel] 14 - REST API: Laravel from scratch

前言


1、基礎

Ref: Build a REST API with Laravel API resourcesphp

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

 

 

2、資源

Goto: Laravel 5.4 From Scratch【原講座】laravel

Goto: https://laravel.com/docs/5.4redis

Ref: Laravel China 社區sql

 

 

3、快捷鍵

[1] 自動生成 html 基本的 head, body 代碼模板。 數據庫

 

[2] extendsbootstrap

 

[3] h1segmentfault

 

[4] bstext後端

 

[5] bssubmitapi

 

 

本系列主要關注一些前面不曾提到的,或者是一些重難點在此複習一遍。

 

 

 

Let's Go!


1、安裝

Ref: [Laravel] 01 - Love beautiful code? We do too. -- 項目配置

Ref: https://laracasts.com/series/laravel-from-scratch-2017/episodes/1

 

 

2、路由

Ref: [Laravel] 02 - Route and MVC

  • 視圖傳參

view中的傳參,能夠做爲第二個參數,或者使用 ->with(<k>, <v>),或者採用 compact 以下所示:

Route::get('/', function () {

  $name = 'Jeffrey';
  return view('welcome', compact('name'));
});

傳參每每與 foreach($tasks as $task) 是好伴侶。

  • 大括號解析變量

如下表達 更爲簡潔。

 

 

3、數據庫

  • 數據遷移 Migration

數據遷移,創建了兩個表。

有三個表:migration,  password_resets,  users

詳情:[Laravel] 08 - Auth & Data Migration「登陸註冊實現 ----> 2、Laravel中的 數據遷移」

 

  • BDD vs TDD 

相對官方的視頻: https://laracasts.com/lessons/phpspec-is-so-good

Ref: http://www.javashuo.com/article/p-yqwenteh-ch.html

phpspec 是 規格驅動的PHP框架。

Behavior Driven Development行爲驅動開發是一種敏捷軟件開發的技術,它鼓勵軟件項目中的開發者、QA和非技術人員或商業參與者之間的協做。

Test-Driven Development,TDD的原理是在開發功能代碼以前,先編寫單元測試用例代碼,測試代碼肯定須要編寫什麼產品代碼。

 

BDD是一種敏捷軟件開發的技術。它對TDD的理念進行了擴展。

在 TDD中側重點偏向開發,經過測試用例來規範約束開發者編寫出質量更高、bug更少的代碼。

而 BDD更加側重設計,其要求在設計測試用例的時候對系統進行定義,倡導使用通用的語言將系統的行爲描述出來,將系統設計和測試用例結合起來,從而以此爲驅動進行開發工做。

 

  • 命令行 php artisan

寫命令:  

php artisan  make:migration  create_tasks_table

來自於:

生成了:

填充類:

class CreateTasksTable extends Migration {

  public function up()
  {
    Schema::create('tasks', function(參數) {
      /* 定義表 */
    });
  }
}

執行類:

php artisan migrate 
  

 

 

4、命令行

  • 建立控制器
php artisan make:controller 控制器名稱
php artisan make
:controller SitesController
  • 建立模型 model
php artisan make:model 模型名稱
php artisan make
:model User
  • 建立數據表
php artisan make:migration create_表名_table --create=表名

php artisan make:migration create_tasks_table --create=tasks // 建立 migration 文件 
php artisan migrate //執行建立指令

  • 添加數據表字段名
php artisan make:migration add_字段名_column_to_表名 --table=表名

php artisan make:migration add_intro_column_to_tasks --table=tasks 
php artisan migrate 

 

 

5、模型

講解:How do query scopes work in Laravel?

模型能夠與數據庫相關構成一個接口封裝: 一個task封裝,其實只是一條sql任務。

 

App\Task::incomplete();

 

App\Task::incomplete()->where('id', '>=" , 2)->get();

 

 

6、控制器 

生成一個 TasksController 控制器。

$ php artisan make:controller TasksController

 

  • 參數的提取和處理

Goto: [Laravel] 02 - Route and MVC  ---->  2、URL 處理

基本思路:得到參數 ---> 傳給模型 ---> 做爲sql查詢的關鍵字 ---> 返回結果

 

  • 表單信息的驗證

[1] 必需要填寫的內容,關鍵字:required.

 

  • Error 信息的輸出

Goto: [Laravel] 07 - Project: functions in Controller - 2、數據驗證

Validator類驗證法 【相較於 控制器驗證法 有什麼好處麼】

// 2. Validator類驗證
$validator = \Validator::make($request->input(), [
    'Student.name' => 'required|min:2|max:20',
    'Student.age'  => 'required|integer',
    'Student.sex'  => 'required|integer',
], [
    'required'     => ':attribute 爲必填項',
    'min'          => ':attribute 長度不符合要求',
    'integer'      => ':attribute 必須爲整數',
], [
    'Student.name' => '姓名',
    'Student.age'  => '年齡',
    'Student.sex'  => '性別',
]);

if ($validator->fails()) {
    return redirect()->back()->withErrors($validator)->withInput();
}

 

 

7、Form Request Data and CSRF【視圖】

Ref: https://v4-alpha.getbootstrap.com/examples/blog/【bootstrap的各類模板】

關於界面部分,本篇暫時不做考慮。如下是其餘的一些界面相關章節:

- Rendering Posts

- Laravel Mix and the Front-end

 

  • 一個例子引出兩個問題

Ref: http://www.javashuo.com/article/p-qlmtlnad-hk.html

@extends('layout')

@section('content')
    <h1>Edit the Comment</h1>

    <form method="POST" action="/comments/{{ $comment->id }}">
     {{ method_field('PATCH') }} {{ csrf_field() }}
<div class="form-group"> <textarea name="content" class="form-control">{{ $comment->content }}</textarea> </div> <div class="form-group"> <button type="submit" class="btn btn-primary">Update Comment</button> </div> </form> @stop

 

  • 跨站方法僞造 
<input type="hidden" name="_method" value="PATCH">

跨站方法僞造,HTML 表單沒有支持 PUTPATCHDELETE 動做

因此在從 HTML 表單中調用被定義的 PUT、PATCH 或 DELETE 路由時,你將須要在表單中增長隱藏的 _method 字段來僞造該方法,詳情參考 官方文檔。 

 

  • 跨站請求僞造

Ref: https://blog.csdn.net/fationyyk/article/details/50832687

CSRF是跨站請求僞造(Cross-site request forgery)

Laravel自動爲每一個用戶Session生成了一個CSRF Token,該Token可用於驗證登陸用戶和發起請求者是不是同一人,若是不是則請求失敗。

Laravel提供了一個全局幫助函數csrf_token(本地存放在:\www\laravel5.1\vendor\laravel\framework\src\Illuminate\Foundation\helpers.php)來獲取該Token值,所以只需在視提交圖表單中添加以下HTML代碼便可在請求中帶上Token。

如下是第二種寫法:

{!! csrf_field() !!}

 

 

8、接口基本思路

[1] 建立控制器,以及對應的遷移文件

$ php artisan make:model Comment -m

[2] 模型

class Post extends Model
{
  public function comments()
  {
    return $this->hasMany(Comment::class);  //返回的是什麼? 
  }

  public function addComment($body)
  {
    $this->comments()->create(compact('body'));
  }
}

[3] 命令行測試模型:$ php artisan tinker 

$ post = App\Post::find(6); # 獲取id=6的數據

  

以上算是 test api 的一個方式。

 

 

 

功能模塊


1、用戶註冊 

Ref: [Laravel] 08 - Auth & Data Migration【此篇的登陸不是很完善,在此補充】

 

  • 添加一個用戶

Ref: 使用 Php Artisan Tinker 來調試你的 Laravel

填充基本信息:name, email, password

如此,數據庫便添加了一條信息。

 

  • ORM關聯

Ref: Associating With Users

也便是:數據庫中關於 user_id字段 的問題。

$comment -> post --> user

Ref: Laravel框架ORM關聯hasOne, belongsTo, hasMany

 

  • 創建兩個 '控制器'

註冊:RegistrationController.php

public function store() {

  (1) Validate the form.
  $this->validate(request(), [
    'name'     => 'required', 
    'email'    => 'required|email', 
    'password' => 'required'
  ]);

  (2) Create and save the user.
  $user = User::create(request(['name', 'email', 'password']));

  (3) Sign them in.
  auth()->login($user);

  (4) Redirect to the home page.
  return redirect()->home();
}

 

會話:SessionsController.php 

public function create()
{

}

public function destroy()
{
  auth()->logout();  

  return redirect()->home(); }

 

  • 導航條username顯示

 

  • 將參數封裝 

[PostsController.php]

auth()->user()->publish(
  new Post(request(['title', 'body']))
); 

[User.php]

public function publish(Post $post)
{
  $this->posts()->save($post);
}

 

  • Guest 中間件 

[SessionsController.php]

public funcion __construct()
{
  $this->middleware('guest', ['except' => 'destroy']);
}

 

 

2、郵件

Ref: [Laravel] 09 - Functional models - 郵件發送

  • 調用 ’send email'
\Mail::to($user)->send(new Email);

 

  • 申請 'email account'

Goto: https://mailtrap.io【申請一個測試郵箱】

 

  • 編寫  'email類’

$ php artisan make:mail Welcome

[app/Mail/Welcom.php]

class Welcome extends Mailable 
{
  ...

  public function __construct(User $user)  # 這裏支持了傳參
  {
    $this->user = $user;
  }

  public functionbuild()
  {
    return $this->view('email.welcome');  # 這裏能夠考慮with傳參
  }
}

 

  • 編寫 view of email

 

  • markdown 

 

Mail:

public functionbuild()
{
  return $this->markdown('emails.welcome-again');
}

View:

同時在 views/emails下生成 welcome-again.blade.php

Goto: https://laravel.com/docs/5.4/mail#writing-markdown-messages

Goto: Laravel 5.4中郵件已支持Markdown語法

 

 

3、Form Requests and Form Objects

  • 生成框架文件

$ php artisan make:request RegistrationRequest 

提供了兩個函數。同時也意味着 request 的處理能夠分配到這裏一部分。

// Determine if the user is authorized to make this request.
public
function authorize() {   return true; } // Get the validation rules that apply to the request. public function rules() {   return [     //   ]; }

 

  • 分離 參數驗證

目的 - 精簡控制器中的函數邏輯

第一步:

[1] 填充 RegistrationRequest

[2] 控制器內對應函數添加參數:RegistrationRequest

 

第二步:

[1] 轉移控制器函數內的剩餘邏輯到自定義函數:persist()

 

[2] 這樣一來,函數已空,但看上去貌似不錯。  

 

 

4、Session Handling and Flash Messaging 

Ref: [PHP] 05 - Cookie & Session【php控制session的原生態方式】 

public function store(RegistrationForm $form)
{
  $form->persist();
  session(
'message', 'Here is a default message');   return redirect()->home(); }

 

Ref: [ Laravel 5.4 文檔 ] HTTP層 —— Session

看這個文檔相對容易一些。

 

  •  DB 做爲 session 驅動

使用 Session 來存儲用戶請求信息。Laravel 經過乾淨、統一的 API 處理後端各類 Session 驅動,目前支持的流行後端驅動包括 MemcachedRedis 和 數據庫。 

Goto: [Laravel] 09 - Functional models - 緩存使用

Goto: [Laravel] 11 - WEB API : cache & timer - 靜態緩存

Goto: [Laravel] 12 - WEB API : cache implement - 三個方案

 

Session 配置文件位於 config/session.php

    • 默認狀況下,Laravel 使用的 Session 驅動爲 file 驅動,這對許多應用而言是沒有什麼問題的。
    • 在生產環境中,你可能考慮使用 memcached 或者 redis 驅動以便獲取更快的 Session 性能。

 

  • 實現方法

以下可見,cache、sessions是分開的目錄。

能夠認爲,sessions 有本身的實現方式,或者能夠藉助 cache 的方式(數據庫)。

相關文章
相關標籤/搜索