laravel 자원을 사용하여 API를 만드는 방법

29080 단어 phpapilaravelbeginners
이 시리즈에서는 애플리케이션에 대한 등록/로그인 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.

  • Scraper API은 정책에 전념한 초창기 회사로 당신의 IP 주소가 웹 페이지를 캡처할 때 차단될 우려를 완화시킬 수 있습니다.IP를 사용하여 회전하므로 테스트를 방지할 수 있습니다.2000만 개 이상의 IP 주소와 무한 대역폭을 보유하고 있습니다.Scraper API 및 2captcha과 같은 도구를 사용하면 다른 개발자보다 더 많은 이점을 얻을 수 있습니다.이 두 가지는 자동화 프로세스에 함께 사용할 수 있다.Scraper API에 this link을 등록하고 사용하면 첫 구매 시 10% 할인을 받을 수 있습니다.
  • 사이트나 앱을 위탁 관리할 곳이 필요합니까?
    이것이 바로 당신이 필요로 하는 해결 방안입니다. 이 Digital ocean을 사용하여 디지털ocean에 로그인하여 최고의 클라우드 서비스 공급자를 체험하세요.
  • 이 개발자가 되는 과정은 길고 고통스러울 수 있지만, 다행히도 link은 공부를 더욱 쉽게 한다.그들은 범위가 광범위한 과정을 제공하고 일류의 훈련사가 있기 때문에 나는 개인적으로 그들을 위해 담보할 수 있다.Pluralsight으로 등록하면 첫 번째 강좌는 50% 할인됩니다.
  • 좋은 웹페이지 즐겨찾기