laravel 자원을 사용하여 API를 만드는 방법
이 시리즈의 이 부분에서 우리는 계속해서 laravel 프로그램을 사용하여 서평 API를 구축하여 가입자가 책을 업로드, 편집, 삭제하고 그들의 서적과 다른 서적을 볼 수 있도록 할 것이다.
laravel API 리소스를 사용합니다.
API 리소스란?
laravel API 리소스는 웅변적인 모델과 응용 프로그램 사용자에게 반환되는 JSON 응답 사이에 있는 변환층을 구성합니다.Laravel의 리소스 클래스를 사용하면 모델 및 모델 컬렉션을 표현 방식으로 쉽게 JSON으로 변환할 수 있습니다.
그들의 작업 원리를 이해하려면 정부의 laravel documentation을 볼 수 있다.
우리가 자원을 사용하기 전에, 우리는 그들이 실현할 모델을 정의해야 한다.본 지침에 대해 우리는 서적, 등급 평가와 사용자 모델을 제공할 것이다.
책 모형을 만들려면 다음 명령을 실행하십시오
php artisan make: model Book -m
- m 로고는 모델에 해당하는 이동 파일을 생성합니다.등급 평가 모델에 대해 이 과정을 반복하다.우리는 laravel에서 이미 만들어진 사용자 모델을 만들 필요가 없다.다음에, 우리는 새로 만든 이동 중의 'up' 함수를 편집할 것입니다.카탈로그
// database/migrations/TIMESTAMP_create_books_table.php
에서 다음과 같이 편집합니다.class CreateBooksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->bigIncrements('id');
$table->Integer('user_id')->unsigned();
$table->string('title');
$table->string('author');
$table->text('description');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('books');
}
}
책의 필드와 책을 추가하는 사용자의 ID를 정의합니다.사용자 ID는 사용자 테이블의 ID 필드를 참조하는 외부 키입니다.그런 다음 등급 마이그레이션
// database/migrations/TIMESTAMP_create_ratings_table.php
을 열고 다음과 같이 조정합니다.<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateRatingsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ratings', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedInteger('user_id');
$table->unsignedInteger('book_id');
$table->unsignedInteger('rating');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ratings');
}
}
이번 마이그레이션에서 등급표가 사용할 필드를 정의했습니다. 이 필드는 ID입니다. 이것은 등급표의 키입니다. 특정한 등급을 발표한 사용자의 ID, 등급을 발표한 도서 ID, 등급 자체(0f 5), 그리고 등급을 만들거나 업데이트하는 시간 스탬프입니다.위의 모든 내용을 실행한 후에 이전을 실행하겠습니다. 그러나 이전하기 전에
app\providers\AppServiceProvider.php
파일로 이동하고defaultStringthLength 편집 안내 함수를 추가하여 이렇게 보이도록 하십시오.<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
}
이것은 대개 MariaDB (예: XAMPP) 나 MySQL의 구 버전에서 발생하는 이전 오류를 처리합니다.현재 php artisan migrate
을 실행하기 위해 설치가 완료되었습니다.모델 간의 관계식 정의하기
이 API의 응용 프로그램 논리에 대해 우리는 모델이 어떻게 서로 관련되고 어떤 유형의 관계를 정의해야만 잘 결합할 수 있는지 이해할 수 있다.
one-to-many relationship
이다.one-to-many
관계이다.자, 이제 설명했습니다. 우리 모델에서 이러한 관계를 정의합시다.
app\User.php
열기 및 추가public function books()
{
return $this->hasMany(Book::class);
}
마찬가지로public function User()
{
return $this->belongsTo(User::class);
}
public function ratings()
{
return $this->hasMany(Rating::class);
}
여기서 우리는 도서 모델과 사용자 모델, 그리고 등급 평가 모델 간의 관계를 정의했다.다음에 우리는 app\Book.php
파일을 편집하여 등급 평가 모델과 도서 모델 간의 관계를 정의할 것이다<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Rating extends Model
{
public function book()
{
return $this->belongsTo(Book::class);
}
protected $fillable = ['book_id','user_id','rating'];
}
관계를 정의하는 것 외에 평가 모델이 받아들일 필드, 즉 책 id,user id와 사용자가 작성해야 할 평가를 대량으로 분배할 수 있습니다.책 모형에 대해 우리는 추가를 통해
protected $fillable = ['user_id','title','author','description'];
도서 자원을 창설하다.
artisan 명령을 사용하여 laravel에서 자원 클래스를 만드는 과정을 간소화합니다.도서 자원 클래스를 만들려면
app/Rating.php
을 실행하십시오php artisan make:Resource BookResource
디렉토리에서 생성됩니다.다음과 같이 app/Http/Resources/BookResource.php
메서드를 탐색 및 편집합니다.<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class BookResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
//transforms the resource into an array made up of the attributes to be converted to JSON
return [
'id'=> $this->id,
'title'=> $this->title,
'author' => $this->author,
'description'=>$this->description,
'created_at' => (string) $this->created_at,
'updated_at' => (string) $this->updated_at,
'user' => $this->user,
'ratings' => $this->ratings,
'average_rating' => $this->ratings->avg('rating')
];
}
}
모든 자원 클래스는 응답을 보낼 때 JSON으로 전환해야 하는 속성 그룹을 되돌려주는 toArray 방법을 정의합니다.JSON으로 변환해야 하는 도서 모형의 모든 속성이 정의되어 있으며, 서열화할 필요가 없는 속성도 삭제할 수 있습니다.모델 속성은 toArray()
변수에서 직접 액세스할 수 있습니다.자원 클래스가 하위 모델의 속성과 방법에 대한 접근을 자동으로 에이전트하기 때문에 접근이 편리하기 때문이다.자원을 정의하면 루트나 컨트롤러에서 되돌아올 수 있습니다.현재 우리는 $this
의 Book Resource 클래스를 사용할 수 있으며, 지금은 그것을 사용할 것이다.도서 컨트롤러 만들기
BookController는
BookController
에 정의된 API 컨트롤러 생성 기능을 사용합니다.php artisan make:controller BookController --api
에 있는 컨트롤러를 열고 붙여넣기<?php
namespace App\Http\Controllers;
use App\Book;
use Illuminate\Http\Request;
use App\Http\Resources\BookResource;
class BookController extends Controller
{
public function __construct()
{
$this->middleware('auth:api')->except(['index', 'show']);
}
/**
* Display all books that have been added
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return BookResource::collection(Book::with('ratings')->paginate(25));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, [
'title' => 'required',
'description' => 'required',
'author' => 'required',
]);
$book = new Book;
$book->user_id = $request->user()->id;
$book->title = $request->title;
$book->description = $request->description;
$book->author = $request->author;
$book->save();
return new BookResource($book);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show(book $book)
{
return new BookResource($book);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Book $book)
{
// check if currently authenticated user is the owner of the book
if ($request->user()->id !== $book->user_id) {
return response()->json(['error' => 'You can only edit your own books.'], 403);
}
$book->update($request->only(['title','author', 'description']));
return new BookResource($book);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Request $request,Book $book)
{
if($request->user()->id != $book->user_id){
return response()->json(['error' => 'You can only delete your own books.'], 403);
}
$book ->delete();
return response()->json(null,204);
}
}
app\Http\Controller\BookController.php
방법으로 추가된 모든 책의 목록을 가져오고 되돌려줍니다.이전에 생성한 index()
을 사용하고 있습니다.BookResource
메서드는 현재 검증된 사용자 ID가 포함된 새 책과 이 책의 상세한 정보를 작성합니다.도서를 저장하기 전에 모든 필드가 입력되었는지 확인하고 검사를 해야 한다.새로 만든 도서를 기준으로 BookResource를 반환합니다.store()
방법은 지정된 도서를 바탕으로 도서 자원을 되돌려준다.show()
방법은 먼저 도서를 업데이트하려는 사용자가 도서를 만드는 사용자임을 확보하기 위해 검사한다.만약 없다면, 우리는 한 사람이 그의 책을 편집할 수 밖에 없다는 소식을 되돌려 줄 것이다.만약 이 사람이 소유자라면, 그들은 새로운 상세한 정보를 사용하여 도서를 갱신하고, 상세한 정보를 포함하는 도서 자원을 되돌려줄 수 있다.update()
방법으로 데이터베이스에서 지정한 책을 삭제합니다.그러나 사람들은 그들이 올린 책 한 권만 삭제할 수 있다.따라서 HTTP 상태 코드 403을 다른 사람의 책을 삭제하려고 하면 자신의 책만 삭제할 수 있음을 알리는 오류 메시지로 설정합니다.사용자가 책 소유자인 경우 응답에 대한 HTTP 상태 코드를 204로 설정합니다. 이는 지정된 자원이 삭제되었기 때문에 반환할 내용이 없음을 나타냅니다.또한, 우리는 이미
destroy()
함수에 auth::api
중간부품을 사용하여 우리의 API 단점을 보호하고 있음을 주의하십시오.우리는 색인과 디스플레이 방법을 없애고 중간부품을 실현합니다.이렇게 하면 경험증이 없는 사용자는 모든 서적과 특정 서적의 목록을 볼 수 있다.API 라우팅 정의
마지막으로 API 라우트를 정의합니다.
__construct
을 열고 다음을 추가하십시오.Route::apiResource('books', 'BookController');
routes\api.php
을 사용하여 API만 라우팅하는 방법을 생성하고 있습니다.이 방법은 API에 특정된 라우팅(인덱스, 저장, 표시, 업데이트 및 제거)만 생성하므로 사용하는 것이 좋습니다.일반적인 apiResource()
방법을 사용하는 것과 달리 이 방법은 API에 특정된 루트를 생성하는 것 외에 resource()
과 create()
의 루트를 생성하는데 이런 루트는 API를 구축할 때 불필요하다.이것은 laravel로 API를 구축하는 두 번째 부분입니다. 저는 원래 세 부분으로 완성하기를 희망했지만, 내용이 너무 많아서 더 많은 부분을 추가해야 합니다. 이것은 등급 평가 기능과 마지막 부분을 포함할 것입니다. 이것은 응용 프로그램의 테스트를 포함하여 그것이 확실히 작동하는지 확인해야 합니다.그러니까 아무데도 가지 마세요:-)
제가 말씀드리고 싶은 것은 제가 this post에서 찾은 pusher.com의 영감입니다. 이것은 좋은 출발점입니다.나는 몇 가지 오류를 발견했다. 나는 이 시리즈를 써서 복구를 시도하고 있다.
너도 나의 github에서 원본 코드를 찾을 수 있다
스폰서
Please note that some of the links below are affiliate links. I only recommend products, tools and learning services I've personally used and believe are genuinely helpful. Most of all, I would never advocate for buying something you can't afford or that you aren't ready to use.
이것이 바로 당신이 필요로 하는 해결 방안입니다. 이 Digital ocean을 사용하여 디지털ocean에 로그인하여 최고의 클라우드 서비스 공급자를 체험하세요.
Reference
이 문제에 관하여(laravel 자원을 사용하여 API를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tngeene/how-to-create-an-api-with-laravel-resources-19ee텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)