您现在的位置是:首页 >技术杂谈 >Laravel CRUD API 實作网站首页技术杂谈

Laravel CRUD API 實作

tp27933 2023-06-08 20:00:02
简介Laravel CRUD API 實作

前言

因緣際會下還是開始學習php了。經歷了風風雨雨終於在今年暑假要去加拿大留學了,php會是第二年的其中一門必修課程,加上最近前端也真的蠻心累,也許有一門精進的後端語言,日後轉職會有更寬廣的道路,對自己說加油!


一、註冊 API

 首先創建auth 的controlller

php artisan make:controller API/AuthController

在laravel 中 使用Eloquent ORM 來控制資料庫

代碼如下:

<?php

namespace AppHttpControllersAPI;

use AppHttpControllersBaseController;
use IlluminateHttpRequest;

use AppModelsUser;
use IlluminateHttpRequest;
use IlluminateSupportFacadesHash;

class AuthController extends BaseController
{
    public function register(Request $requst)
    {
          $user = User::create([
              'username' => $requst->input('username'),
              'email' => $requst->input('email'),
              'password' => Hash::make($requst->input('password')),
          ]);
          $token = $user->createToken('user_token')->
          return $this->response([
              'user' => $user,
              'token' => $token
          ]);
        }
    }

}

現在來一步步拆解上方的代碼

  • 首先引入model User (laravel 預設Models 資料夾下有User.php) 
    使用該model的方法創建一個新的資料  User::create 接受一個數組參數,裏面則是要添加的key跟value  'key' => value 
  • $request-> input 這個方法則可以獲取前端傳送的參數
  • Hash::make() 則是表示雜湊(Hash)過後的字串。
     

這裡對於剛入門後端的新手來說會有一個問題是儲存密碼為什麼不能直接儲存,而存包裹後的密碼呢?這是因為由於用戶可能會在不同的網站內使用同一組密碼,所以我們要避免密碼存在資料庫時,如果不小心外流的話,會造成嚴重的安全問題。所以一般來說,存在資料庫內的內容,會是雜湊(Hash)過後的字串。

  • 最後創建token 並且調用plainTextToken
    使用 plainTextToken 可以調用未 hash 前的 token。
  • 最後返回token以及註冊成功的用戶訊息

2.添加驗證

首先創建 request 檔案,指令如下

 php artisan make:request Auth/RegisteRequest

在rules的方法中返回相對的驗證規則,代碼如下: 

<?php

namespace AppHttpRequestsAuth;

use IlluminateFoundationHttpFormRequest;

class RegisteRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, IlluminateContractsValidationValidationRule|array|string>
     */
    public function rules()
    {
        return [
            'username' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:4'
        ];
    }
}

回到controller , 只要將原本的Request換成剛剛的RegisteRequest即可,完整代碼如下

<?php

namespace AppHttpControllersAPI;

use AppHttpControllersBaseController;
use AppHttpRequestsAuthRegisteRequest;

use AppModelsUser;
use IlluminateHttpRequest;
use IlluminateSupportFacadesLog;
use IlluminateSupportFacadesHash;

class AuthController extends BaseController
{
    public function register(RegisteRequest $requst)
    {
        try {
            $user = User::create([
                'username' => $requst->input('username'),
                'email' => $requst->input('email'),
                'password' => Hash::make($requst->input('password')),
            ]);
            $token = $user->createToken('user_token') -> plainTextToken;
            return $this->response([
                'user' => $user,
                'token' => $token
            ]);
        } catch (Exception $e) {
            return $this->response([
               null,
            ], $e->getMessage(), 400);
        };
    }
}

二、登入 API

待更新....


補充:

Eloquent ORM的基本使用方法

notice: PK. = primary key

// 拿User這個model舉例

// 查詢PK = 1的資料
User::find(1);

// 查詢多筆資料 By PK欄位
User::find([1, 2, 3]);

// Where條件式,第一個參數為欄位名稱,第二個參數為值
User::where('name', 'Yee');

// Where也可以這樣用
User::where('age', '>', '18');

// Where還能這樣用 ((我最愛這方法XD
$query = [['name', '=', 'Yee'], ['age', '>', '18']]
User::where($query);

// 當然也有where NULL
User::whereNull('name')->get();
User::whereNotNull('name')->get();

// Insert 的方法一
$user = new User;
$user->name = 'Yee';
...
$user->save();

// Insert 的方法二
$attributes = [['name'=>'Yee', 'email'=>'yee@gmail.com']];
$user = User::create($attributes);

// 兩個新增的方法都會讓 $user 擁有剛剛新增得值

// Update 的方法一
$user = User::find(1);
$user->name = 'Yee2';
$user->save();

// Update 的方法二
// where條件請參考上面的方法
$user = User::where($query)->update($attributes);

// Delete 的方法,
User::find(1)->delete();

更進階的用法 

// 有資料回傳資料否則拋出Exception
User::find(1)->firstOrFail()

// 有資料回傳資料,否則使用另一個條件式查詢
User::where('name', 'Yee')->firstOr(['name', 'Yee2'])

// 有資料就回傳,否則新增一筆資料,方法一
$user = User::firstOrNew(
    ['email' =>  'yee@gmail.com'],
    ['name' => 'yee']
);

$user->save();

// 有資料就回傳,否則新增一筆資料,方法二
// 這方法不需要 $user->save();
$user = User::firstOrCreate(
    ['email' =>  'yee@gmail.com'],
    ['name' => 'Yee']
);

// 有資料就更新,否則新增一筆資料
$user = User::updateOrCreate(
    ['email' =>  'yee@gmail.com'],
    ['name' => 'Yee']
);更 

以上的條件式的結尾可以用

// 取第一筆 User::find(1)->first(); // 取全部 User::where('age', '>', '18')->get(); 

$request的常用方法

方法描述
input('key','default-value')
此方法可以獲取get請求所帶來的特定參數的值,如果沒有該參數則返回默認值
all()
此方法獲取get請求的所有參數,然後會返回一個數組,一個鍵值對數組
path()
對於http://localhost/test?b=37521請求,會返回'test'僅僅是個‘路徑’
url()
對於http://localhost/test?b=37521請求,會返回'http://localhost/test',也就是說,url不帶參數
fullUrl()
請求完整url,比如請求的路徑是 localhost:8000/test?id=10則返回"http://localhost:8000/test?id=1"
isMethod('GET')
判斷請求的方式,返回值為布爾值
getMethod()
獲取請求方式,返回為字符串
is($pattern, $path)判斷當前參數是否符合pattern
cookie('key','default-value')
從請求實例中拿取某個cookie,如果沒有則會返回默認的值
hasFile('file')
參數'file'是上傳文件時候的name='file',通過此方法判斷上傳文件時候是否真的選擇了待上傳的文件
file('file')
通過此方法獲取上傳的文件,對該函數的返回值進行判斷無誤後應該處理如何保存文件到對應的位置
header(‘Connection’)獲取請求頭Connection
except([‘username’,’password’]) /except( 'username' , 'password'])剔除不必要的屬性(username,password)
only([‘username’,’password’]) /only( 'username' , 'password'])提取指定屬性(username,password)

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。