Day 6 - Laravel 8.0 如何快速建立API

Day 3 - 如何运用 Laravel 框架设计模式规划大型专案,当中提到Controller-Service-Repository的沟通,今天会介绍到底如何撰写.

  1. 首先建立model及migration

app/Models/Post.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = [
        'user_id',
        'title',
        'content'
    ];

    /**
     * 将资料作转换
     *
     * @var array
     */
    protected $casts = [
        'created_at' => 'datetime:Y-m-d H:i:s',
        'updated_at' => 'datetime:Y-m-d H:i:s'
    ];
}

database/migrations/2021_09_19_082930_create_posts_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id')->comment('发文者');
            $table->string('title')->unique()->comment('标题');
            $table->string('content')->comment('内文');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}
  1. 首先建立Controller, Service, Repository
$ sail artisan make:controller PostController
$ sail artisan make:service PostService
$ sail artisan make:repository PostRepository
  1. 设定routes/api.php,让我们能透过路由对应到指定的Controller
    • 可以看到我们把发布文章的API设定在jwt.auth的Group当中,这麽一来我们就能确保没经过身份验证的使用者无法建立文章.
<?php
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;


Route::middleware(['jwt.auth'])->group(function () {
    Route::group(['prefix' => 'post'], function () {
        Route::post('/', [PostController::class, 'create']);
    });
});

  1. 调整PostController,可以看到我们在construct地方自动注入了PostService,藉此可以调用内部的function
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\PostService;
use Illuminate\Http\JsonResponse;

class PostController extends Controller
{
    protected $service;

    public function __construct(PostService $service)
    {
        $this->service = $service;
    }

    /**
     * 建立文章
     * @param Request $request
     * @return JsonResponse
     */
    public function create(Request $request): JsonResponse
    {
        $result = $this->service->create($request->all());
        return response()->json($result);
    }
}
  1. 调整PostService,同上在Service自动注入Repository
<?php

namespace App\Services;

use Yish\Generators\Foundation\Service\Service;
use App\Repositories\PostRepository;
use Illuminate\Support\Arr;

class PostService
{
    /**
     * @var PostRepository
     */
    protected $post_repository;

    public function __construct(PostRepository $post_repository)
    {
        $this->post_repository = $post_repository;
    }

    /**
     * 建立文章
     * @param array $data
     * @return mixed
     */
    public function create(array $data)
    {
        $title = Arr::get($data, 'title');
        $content = Arr::get($data, 'content');
        $post = $this->post_repository->createPost($title, $content);

        return $post;
    }
}
  1. 接下来建立Repository
<?php

namespace App\Repositories;

use App\Models\Post;
use App\Models\User;
use Exception;
use Illuminate\Support\Facades\Auth;

class PostRepository
{
    /**
     * 建立文章
     *
     * @param string $title 标题
     * @param string $content 内文
     * @return mixed
     */
    public function createPost(string $title, string $content)
    {

        try {
            $user = Auth::guard('api')->user();

            $post = new Post();
            $post->title = $title;
            $post->content = $content;
            $post->user_id = $user->id;
            $post->save();

            return $post;
        } catch (Exception $e) {
            dd($e);
        }
    }
}

上述都建立完後,我们就可以透过Postman Call API来建立新的文章

如此一来就简单快速的完成了发布文章的API,接下来文章会介绍写Request validation与Error handler来优化我们的API.


<<:  学习Python纪录Day6 - String type和Container type的运算子

>>:  [Day7]Week1总结!

Unity与Photon的新手相遇旅途 | Day18-技能冷却

今天的内容为教大家如何制作技能冷却的效果。 ...

第18车厢-动ㄘ动ㄘ!tab页签切换+轮播应用篇

本篇介绍透过bootstrap4直接使用tab切换功能,并且实作tab切换自动循环播放 我们在昨篇...

Day 18 UItableView的练习 (2/3)

上一篇我们讲到建立一个UItable View的一些基本方法,接下来我们可以建立一些资料在上面 va...

Day 06 | Dart基本介绍 - private & static

在昨天的文章中,讲到了类别基础用法包含了「宣告」、「建构子」及「实体化」,今天会继续说明Dart c...

Day 0 [PV]: 原生 vs 跨平台框架

哇哇哇,挑战第一天我就没准备好,只能很赶的生出一篇文章。 不负责任预告一下:我中文不是很好所以要是文...