Laravel 8 - REST API

Laravel 8 - REST API 首页 / Laravel8入门教程 / Laravel 8 - REST API

本文将为您提供使用laravel 8 api rest的简单示例。

步骤1:安装Laravel 8

执行下面命令拉取最新的框架代码。

composer create-project --prefer-dist laravel/laravel blog

步骤2:使用Passport

在此步骤中,无涯教程需要通过Composer Packager Manager安装Passport包。

composer require laravel/passport

成功安装包后,需要在数据库中创建新的Passport表来获取默认迁移。

php artisan migrate

接下来,需要使用passport:install命令使用命令安装Passport。

php artisan passport:install

步骤3:Passport配置

在此步骤中,必须在model,service provider和auth配置文件上进行配置。在auth.php中,添加了API Auth配置。

app/Models/User.php

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Notifications\Notifiable;

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable

{

use HasApiTokens HasFactory Notifiable;

/**

* The attributes that are mass assignable.

*

* @var array

*/

protected $fillable = [

'name'

'email'

'password'

];

/**

* The attributes that should be hidden for arrays.

*

* @var array

*/

protected $hidden = [

'password'

'remember_token'

];

/**

* The attributes that should be cast to native types.

*

* @var array

*/

protected $casts = [

'email_verified_at' => 'datetime'

];

}

config/auth.php

<?php

return [

.....

'guards' => [

'web' => [

'driver' => 'session'

'provider' => 'users'

],

'api' => [

'driver' => 'passport'

'provider' => 'users'

],

],

.....

]

步骤4:添加Product表和Model模型

接下来,无涯教程需要使用Laravel 8 php artisan命令为posts表创建迁移:

php artisan make:migration create_products_table

执行此命令后,您将在以下路径database/migrations中找到一个文件,并且将以下代码复制进去。

<?php

use Illuminate\Support\Facades\Schema;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Database\Migrations\Migration;

class CreateProductsTable extends Migration

{

/**

* Run the migrations.

*

* @return void

*/

public function up()

{

Schema::create('products' function (Blueprint $table) {

$table->id();

$table->string('name');

$table->text('detail');

$table->timestamps();

});

}

/**

* Reverse the migrations.

*

* @return void

*/

public function down()

{

Schema::dropIfExists('products');

}

}

创建迁移后,需要通过以下命令运行上面的迁移:

php artisan migrate

创建"Product"产品表后,您应该为产品Product创建Model模型。

app/Models/Product.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;

class Product extends Model

{

use HasFactory;

/**

* The attributes that are mass assignable.

*

* @var array

*/

protected $fillable = [

'name' 'detail'

];

}

步骤5:创建API路由

在此步骤中,无涯教程将创建API路由。 Laravel提供编写Web服务路由的api.php文件。所以在该文件上添加新路由。

routes/api.php

<?php

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\API\RegisterController;

use App\Http\Controllers\API\ProductController;

/*

|--------------------------------------------------------------------------

| API Routes

|--------------------------------------------------------------------------

|

| Here is where you can register API routes for your application. These

| routes are loaded by the RouteServiceProvider within a group which

| is assigned the "api" middleware group. Enjoy building your API!

|

*/

Route::post('register' [RegisterController::class 'register']);

Route::post('login' [RegisterController::class 'login']);

Route::middleware('auth:api')->group( function () {

Route::resource('products' ProductController::class);

});

步骤6:创建控制器

在下一步中,现在将新的控制器创建为BaseController,ProductController和RegisterController,在Controllers文件夹中创建了新的文件夹"API",因为会制作一个单独的API控制器,因此创建两个控制器:

app/Http/Controllers/API/BaseController.php

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;

use App\Http\Controllers\Controller as Controller;

class BaseController extends Controller

{

/**

* success response method.

*

* @return \Illuminate\Http\Response

*/

public function sendResponse($result $message)

{

$response = [

'success' => true

'data' => $result

'message' => $message

];

return response()->json($response 200);

}

/**

* return error response.

*

* @return \Illuminate\Http\Response

*/

public function sendError($error $errorMessages = [], $code = 404)

{

$response = [

'success' => false

'message' => $error

];

if(!empty($errorMessages)){

$response['data'] = $errorMessages;

}

return response()->json($response $code);

}

}

app/Http/Controllers/API/RegisterController.php

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;

use App\Http\Controllers\API\BaseController as BaseController;

use App\Models\User;

use Illuminate\Support\Facades\Auth;

use Validator;

class RegisterController extends BaseController

{

/**

* Register api

*

* @return \Illuminate\Http\Response

*/

public function register(Request $request)

{

$validator = Validator::make($request->all(), [

'name' => 'required'

'email' => 'required|email'

'password' => 'required'

'c_password' => 'required|same:password'

]);

if($validator->fails()){

return $this->sendError('Validation Error.' $validator->errors());

}

$input = $request->all();

$input['password'] = bcrypt($input['password']);

$user = User::create($input);

$success['token'] = $user->createToken('MyApp')->accessToken;

$success['name'] = $user->name;

return $this->sendResponse($success 'User register successfully.');

}

/**

* Login api

*

* @return \Illuminate\Http\Response

*/

public function login(Request $request)

{

if(Auth::attempt(['email' => $request->email 'password' => $request->password])){

$user = Auth::user();

$success['token'] = $user->createToken('MyApp')-> accessToken;

$success['name'] = $user->name;

return $this->sendResponse($success 'User login successfully.');

}

else{

return $this->sendError('Unauthorised.' ['error'=>'Unauthorised']);

}

}

}

app/Http/Controllers/API/ProductController.php

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;

use App\Http\Controllers\API\BaseController as BaseController;

use App\Models\Product;

use Validator;

use App\Http\Resources\Product as ProductResource;

class ProductController extends BaseController

{

/**

* Display a listing of the resource.

*

* @return \Illuminate\Http\Response

*/

public function index()

{

$products = Product::all();

return $this->sendResponse(ProductResource::collection($products), 'Products retrieved successfully.');

}

/**

* Store a newly created resource in storage.

*

* @param \Illuminate\Http\Request $request

* @return \Illuminate\Http\Response

*/

public function store(Request $request)

{

$input = $request->all();

$validator = Validator::make($input [

'name' => 'required'

'detail' => 'required'

]);

if($validator->fails()){

return $this->sendError('Validation Error.' $validator->errors());

}

$product = Product::create($input);

return $this->sendResponse(new ProductResource($product), 'Product created successfully.');

}

/**

* Display the specified resource.

*

* @param int $id

* @return \Illuminate\Http\Response

*/

public function show($id)

{

$product = Product::find($id);

if (is_null($product)) {

return $this->sendError('Product not found.');

}

return $this->sendResponse(new ProductResource($product), 'Product retrieved successfully.');

}

/**

* Update the specified resource in storage.

*

* @param \Illuminate\Http\Request $request

* @param int $id

* @return \Illuminate\Http\Response

*/

public function update(Request $request Product $product)

{

$input = $request->all();

$validator = Validator::make($input [

'name' => 'required'

'detail' => 'required'

]);

if($validator->fails()){

return $this->sendError('Validation Error.' $validator->errors());

}

$product->name = $input['name'];

$product->detail = $input['detail'];

$product->save();

return $this->sendResponse(new ProductResource($product), 'Product updated successfully.');

}

/**

* Remove the specified resource from storage.

*

* @param int $id

* @return \Illuminate\Http\Response

*/

public function destroy(Product $product)

{

$product->delete();

return $this->sendResponse([], 'Product deleted successfully.');

}

}

步骤7:创建Eloquent API资源

这是在Laravel 8中创建REST API的一个非常重要的步骤。您可以使用具有API的Eloquent API资源。它将有助于您对模型对象进行相同的响应布局。无涯教程在ProductController文件中使用。现在需要使用以下命令创建它:

php artisan make:resource Product

现在,使用以下路径上的新文件夹创建了新文件:

app/Http/Resources/Product.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Product extends JsonResource

{

/**

* Transform the resource into an array.

*

* @param \Illuminate\Http\Request $request

* @return array

*/

public function toArray($request)

{

return [

'id' => $this->id

'name' => $this->name

'detail' => $this->detail

'created_at' => $this->created_at->format('d/m/Y'),

'updated_at' => $this->updated_at->format('d/m/Y'),

];

}

}

现在已准备好在Laravel中运行API和Passport API。

php artisan serve

确保在详细信息API中,无涯教程将在下面列出的下面使用以下标题:

'headers' => [

'Accept' => 'application/json'

'Authorization' => 'Bearer '.$accessToken

]

现在只需您可以像下面的屏幕截图一样运行上面列出的URL:

1)注册(Register)接口  -  API网址:http://localhost:8000/api/register

2)登录(Login)接口   -  API网址:http://localhost:8000/api/login

3)产品列表(Product List) 接口  -  API网址:http://localhost:8000/api/products

4)产品创建(Create)接口    -  API网址:http://localhost:8000/api/products

5)产品显示(Show)接口  -  API网址:http://localhost:8000/api/products/{id}

6)产品更新(Update) 接口     -  API网址:http://localhost:8000/api /产品/ {id}

7)产品删除(Delete)接口   -  API 网址:http://localhost:8000/api/products/{id}

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

从0开始学架构 -〔李运华〕

从0开始学游戏开发 -〔蔡能〕

深入拆解Java虚拟机 -〔郑雨迪〕

TensorFlow快速入门与实战 -〔彭靖田〕

TypeScript开发实战 -〔梁宵〕

全链路压测实战30讲 -〔高楼〕

超级访谈:对话玉伯 -〔玉伯〕

Vue 3 企业级项目实战课 -〔杨文坚〕

AI 应用实战课 -〔黄佳〕

好记忆不如烂笔头。留下您的足迹吧 :)