在Day 3 - 如何运用 Laravel 框架设计模式规划大型专案,当中提到Controller-Service-Repository的沟通,今天会介绍到底如何撰写.
<?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'
];
}
<?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');
}
}
$ sail artisan make:controller PostController
$ sail artisan make:service PostService
$ sail artisan make:repository PostRepository
routes/api.php
,让我们能透过路由对应到指定的Controller
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']);
});
});
<?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);
}
}
<?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;
}
}
Auth::guard('api')->user()
来取得User model,藉此可以知道发文者的user_id<?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的运算子
今天的内容为教大家如何制作技能冷却的效果。 ...
本篇介绍透过bootstrap4直接使用tab切换功能,并且实作tab切换自动循环播放 我们在昨篇...
上一篇我们讲到建立一个UItable View的一些基本方法,接下来我们可以建立一些资料在上面 va...
在昨天的文章中,讲到了类别基础用法包含了「宣告」、「建构子」及「实体化」,今天会继续说明Dart c...
哇哇哇,挑战第一天我就没准备好,只能很赶的生出一篇文章。 不负责任预告一下:我中文不是很好所以要是文...