---
# System prepended metadata

title: Nignx + Laravel + php + mysql 實作 RESTful API

---

# Nignx + Laravel + php + mysql 實作 RESTful API
只是紀錄我自己如何成功實作，此為最終版本
**環境**
Oracle 8.7
Laravel Framework 7.30.6
PHP 7.2.24
mysql 8.0.30
# Nginx
> Nginx（發音同「engine X」）是非同步框架的網頁伺服器，也可以用作反向代理、負載平衡器和HTTP快取。 --來自維基
> 總之就是類似於apache的webserver，但對於記憶體的使用量較少，能處理的請求也比較多。
> nginx能在回應請求後，遇到的php請求經過fastcgi_pass交給php-fpm處理，再把處理的結果返回。

**相關配置:**
在/etc/nginx/nginx.conf的檔案設定
```
server{
        listen 8081; #port是8081
        server_name example.com;
        root /var/www/laravel/laravel/public; #此路徑是在laravel專案中的路徑
        index index.php index.html index.htm; #php檔案優先

        location / {
            # 這段的意義代表我們將所有的請求都交給 Laravel 的路由去處理，因此如 404 的頁面都是交由 Laravel 處理
                    try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ [^/]\.php(/|$) {
                #將遇到的php檔交給php-fpm做處理
                fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

```
# Laravel
> Laravel 是一個由Taylor Otwell所建立，自由開源的 PHP Web 框架，旨在實作的Web軟體的MVC架構。Laravel的特色包含：支援使用者身分驗證和授權，具有模組化的套件系統且有專屬的套件庫，提供連接許多種類的關連式資料庫的方式，提供工具來協助應用程式的部署和維持。 --來自維基

**相關配置:**
建立laravel的專案，我的專案名稱是laravel。
*我的資料夾路徑是/var/www/laravel/laravel，以下操作都會以這個路徑進行*
有個隱藏檔案是.env，對它進行修改
```
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:5N5tJPdwlhjnnOExBeMjUgS4B0Vk3iQ86cJ3SH1ms7M=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql #所用的資料庫
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE= #資料庫名稱
DB_USERNAME= #使用者帳號
DB_PASSWORD= #使用者密碼
```
若APP_KEY沒有值，可以輸入下面指令，會直接更新在.env裡。
```
php artisan key:generate
```
* 建立Eloquent Model
laravel官方提供的ORM框架(Object-Relational Mapping 對象關係映射)，後端的物件型資料和資料庫中的關係型的資料通過這個橋樑來相互轉化。
總之就是，建立一個物件對應資料庫的結構，往後只需操作物件就可以對資料庫的資料進行讀取、新增、修改、刪除…..等。
輸入指令
```
php artisan make:model UserInfo
```
會在 app/ 資料夾裡建立檔案，名稱是UserInfo.php，接著進行設定
```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

//依照資料表的結構做設定
class UserInfo extends Model
{
        protected $table = 'member';//資料表名稱
        protected $primaryKey = 'id';// 主鍵
        public $timestamps = false;
        protected $fillable =     ['id','username','email','phone','age']; //
}
```

* 建立Controller
Controller 負責處理 Model 的數據。
有兩種生成模板，在生成的function上有些微差異，我選擇的是 --api，會生成
index():抓取所有資料的列表
show():抓取指定 id 的資料
store():增資料
update():更新資料
destory():刪除資料
省去了create與edit
輸入下面指令
```
php artisan make:controller api/UserInfoController --api
```
此指令會在app/Http/Controller/api的路徑上建立名為UserInfoController.php的檔案。
以調用 Model 的方法，獲取、更新資料，再根據 CRUD 四種方式，配置相對應的 function
```
<?php

namespace App\Http\Controllers\api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\UserInfo; 

class UserInfoController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return response()->json(UserInfo::all(), 200);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $userInfo = UserInfo::create($request->all());

        return response()->json($userInfo, 201);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        return response()->json(UserInfo::find($id), 200);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $userInfo = UserInfo::findOrFail($id);
        $userInfo->update($request->all());

        return response()->json($userInfo, 200);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        UserInfo::find($id)->delete();

        return response()->json(null, 204);
    }
}
```
* 更改Routes
Routes 會根據請求的路徑和 HTTP Verb 的不同調用對應的 Controller 的某個 Function。
新增下面的程式碼至routes/api.php這個檔案
```
//'user'是對應的路徑，{}代表著要傳入的參數
//'api\UserInfoController@index'表示Controller的路徑以及function名稱。

Route::get('user', 'api\UserInfoController@index');
Route::get('user/{id}', 'api\UserInfoController@show');
Route::post('user', 'api\UserInfoController@store');
Route::put('user/{id}', 'api\UserInfoController@update');
Route::delete('user/{id}', 'api\UserInfoController@destroy');
```
完成這三部分，laravel的部分也搞定了。
# php-fpm

在/etc/php-fpm.d的目錄下，有www.conf的檔案，對此進行修改
```
"新增"
user = webmail
group = webmail
listen = 127.0.0.1:9000
"修改"
listen.owner = nginx
listen.group = nginx
listen.mode =0660
```
並將php-fpm開啟
```
php-fpm
```
# Mysql
需先啟動mysql伺服器
```
service mysqld start
```
再輸入以下指令
```
mysql -u root -p
```
創造一個資料庫並且按照需求創造資料表
相關指令: https://blog.xuite.net/towns/hc/65849335
# postman測試
若伺服器的IP位址是172.0.0.11，且開的port為8081，輸入以下URL訪問
```
http://172.0.0.11:8081/api/user
```
**GET:**
```
http://172.0.0.11:8081/api/user
```
或者
```
//{id}為選擇的資料，這題範例是按照id的值，再mysql有設定主鍵。
http://172.0.0.11:8081/api/user{id}
```
**POST:**
```
http://172.0.0.11:8081/api/user
//輸入資料(選擇body->row，並且下拉選單選擇JSON)，例:
{
    "name": "John Doe",
    "email": "johndoe@example.com",
    "age": 30
}
```
**PUT**
```
//{id}為選擇的資料，這題範例是按照id的值，再mysql有設定主鍵。
http://172.0.0.11:8081/api/user{id}
```
```
http://172.0.0.11:8081/api/user
//輸入資料(選擇body->row，並且下拉選單選擇JSON)，例:
{
    "name": "John Doe",
    "email": "johndoe@example.com",
    "age": 30
}
```
**delete**
```
//{id}為選擇的資料，這題範例是按照id的值，再mysql有設定主鍵。
http://172.0.0.11:8081/api/user{id}
```
# 參考資料
**環境安裝:**
https://vocus.cc/article/6299f859fd89780001bd2895
https://tony915.gitbooks.io/laravel4/content/install/install_composer.html
https://vocus.cc/article/61891655fd89780001e85c44
**配置參考:**
https://medium.com/itsems-frontend/api-是什麼-restful-api-又是什麼-a001a85ab638
https://angela52799.medium.com/php-基本配置與-restful-api-入門-17a4284b0100
https://hackmd.io/D1FIJHToSpex0rYwQgKJ1w?both
http://blog.tonycube.com/2018/09/vps-centos-7-nginx-php-fpm-mariadb-8-using-nginx.html
https://ithelp.ithome.com.tw/articles/10214868
https://angela52799.medium.com/php-laravel-%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8-16fc4c2271ee
https://ithelp.ithome.com.tw/articles/10218687