이벤트 티켓 서비스 만들기(Laravel API+ReactJS+NextJS+Material UI)

27288 단어 phpapitutoriallaravel
Laravel은 강력한 백엔드 응용 프로그램과 API를 신속하게 만드는 데 매우 쉽습니다.오늘, 우리는 이벤트 디렉터리와 티켓 플랫폼 (예: Eventbrite) 을 위해 API를 만들 것입니다.이 API는 모든 전단이나 후단 프로그램에서 사용할 수 있습니다. 이 강좌의 다음 부분에서 ReactJS 기반 관리 대시보드를 만들 것입니다. 이 API를 사용하여 게시물을 조회, 창설, 편집, 삭제할 수 있습니다.
브랜드 IworkSeshSource를 기반으로 한 이 프로젝트는 마리화나 중심의 활동을 위한 캠페인 티켓 서비스 플랫폼이다.Laravel에서 Wordpress+ 플러그인 대신 SeshSource 현재 구조의 거울을 만들 것입니다.

필수 기능(MVP)
저는 먼저 MVP 또는 가장 낮은 실행 가능한 제품의 기능, 예를 들어 조회 활동과 입장권 구매를 요약했습니다.

번호부
  • 날짜별로 검색 가능한 이벤트
  • 사이트 또는 범주별 이벤트
  • 활동 조직자의 사용자 프로필
  • 이벤트가 포함된 달력 보기
  • 목록/카드 보기
  • 모든 도시, 주 등 목록 + 파일 페이지

  • 전자 상거래
  • 무료 또는 유료 입장권 구매
  • 티켓 생성 PDF
  • 사용자에게 보내는 이메일 PDF
  • 신규 구매 이메일 비즈니스에 대한 정보
  • 이벤트 입장권 스캔을 위한 모바일 친선 인터넷 애플리케이션

  • 조직자 도구
  • 이벤트 관리를 위한 대시보드
  • 생성 이벤트
  • 이벤트 편집
  • 이벤트 삭제
  • 특정 이벤트(무료, VIP 등)를 위한 티켓 유형 만들기
  • 활동 참여자 명단
  • 참조(인쇄)
  • 주문 목록 참조(+ 인쇄)
  • 이제 우리가 API에서 얻고 싶은 것을 알았으니 인코딩을 시작합시다!

    Docker와 함께 Laravel 항목 설정하기
    다음은 제가 새로운 Laravel 프로젝트를 시작하고 Docker를 사용하여 로컬 개발을 하는 방법입니다.
  • composer create-project --prefer-dist laravel/laravel seshsource-api
  • git clone https://github.com/Laradock/laradock.git - 프로젝트 폴더에 Laradock을 배치해야 합니다
  • .
  • cd laradock
  • 예제 환경 파일을 실제 환경 파일로 복사: cp env-example .env
  • Laravel 루트 환경을 Laradock를 호스트로 사용하도록 변경(Laravel은 localhost를 사용하지만 Laradock는 서비스 이름을 사용하여 Docker 컨테이너의 모든 서비스에 액세스):
  • DB_HOST=mysql
    DB_DATABASE=default
    DB_USERNAME=default
    REDIS_HOST=redis
    QUEUE_HOST=beanstalkd
    
  • docker-compose up -d nginx mysql phpmyadmin redis workspace
  • Docker 개발 서버에 Laravel 프로젝트를 로컬로 배치해야 합니다.간단하죠?😁

    OAuth2.0 서버, 4단계 이상
    인증을 사용하여 Laravel을 설정하고 OAuth2를 추가합니다.0 Passport 패키지 지원:
  • composer require laravel/passport 프로젝트 루트
  • docker-compose exec workspace php artisan migratelaradock 폴더 중cd laradock
  • docker-compose exec workspace php artisan passport:install
  • 따라가기the guide in Laravel docs for adding traits to User class
  • docker-compose exec workspace php artisan make:auth
  • docker-compose exec workspace php artisan app:name SeshSource - 응용 프로그램 이름을 설정하는 곳입니다.이것은 전체 응용 프로그램의 '명칭 공간' 에서 사용되기 때문에 인용 모델은 다음과 같다. use SeshSource\Events

  • UUID
    나는 직접 ID가 아닌 UUID를 사용하는 것을 좋아한다.Laravel 5.6 이전 버전을 사용하는 경우 이 라이브러리를 설치합니다.그렇지 않으면 Laravel 5.6 이상 릴리즈에서는 uuid()helper method가 사전 설치되어 있습니다.너는 여전히 특질을 창조해야 하지만, 의지할 필요는 없다.
  • composer require webpatser/laravel-uuid
  • config/app에 추가합니다.별명 그룹이 있는 php 파일: 'Uuid' => Webpatser\Uuid\Uuid::class,
  • 현재 우리는 단지 이전 중 $table->uuid('id'); $table->primary('id'); 을 사용하고 있을 뿐 $table->increments('id'); 을 사용하지 않는다.
    모든 모델에서 UUID를 사용하여 자동 증가를 제거해야 합니다.
    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;
    
    새 게시물을 작성해야 할 경우 UUID 생성(app/Traits/UUUID.php)을 처리할 새 Trait를 만듭니다.

    종속 버전
    <?php
    
    namespace SeshSource;
    
    use Webpatser\Uuid\Uuid;
    trait Uuids
    {
    
        /**
         * Boot function from laravel.
         */
        protected static function boot()
        {
            parent::boot();
    
            static::creating(function ($model) {
                $model->{$model->getKeyName()} = Uuid::generate()->string;
            });
        }
    }
    ?>
    

    라빌 5.6 UUID
    <?php
    
    namespace SeshSource\Traits;
    
    use Illuminate\Support\Str;
    
    trait Uuids
    {
    
        /**
         * Boot function from laravel.
         */
        protected static function boot()
        {
            parent::boot();
    
            static::creating(function ($model) {
                $model->{$model->getKeyName()} = (string) Str::uuid();
            });
        }
    }
    ?>
    
    모든 UUID 모델에 다음 피쳐를 추가합니다.
    use SeshSource\Traits\Uuids;
    
    ...
    
    class User extends Authenticatable
    {
    use Uuids;
    

    마이그레이션 및 모델
    Laravel은 명령 하나만 있으면 모델을 간단하게 만들 수 있습니다. 이것은 데이터와 상호작용을 하고 데이터베이스 테이블을 만드는 PHP 문장을 이전하는 데 도움이 됩니다. (SQL이 필요 없습니다.)우리는 10개의 모델과 데이터베이스 테이블을 만들어서 우리 사이트의 모든 데이터를 저장할 것이다.
    나는 이 구조의 결정 과정을 상세하게 소개하지 않지만, 기본적으로Wordpress 데이터베이스 구조인 WooCommerce와 Tickera 플러그인을 결합한 데이터베이스 구조이다.이벤트는 하나의 테이블에 저장되며, 모든 추가 '메타데이터' 는 투시표에 저장됩니다.이는 카트'주문서'와 유사합니다.우리는 주문서에 전문적으로 사용되는 표와 각 단독 상품에 사용되는 데이터 투시표(가격과 수량 포함)가 있습니다.우리는 쇼핑 카트 전체를 한 열에 저장하는 것이 아니라 데이터 투시표를 사용합니다. (JSON, 쉼표로 구분된 ID 등 서열화) Laravel의 관계를 이용하여 관련 데이터를 효율적으로 불러올 수 있습니다.
    프로젝트 루트 디렉토리에서 다음 명령을 실행하여 모델을 생성하고 마이그레이션합니다.
    php artisan make:model Events -m
    php artisan make:model EventMeta -m
    php artisan make:model TicketTypes -m
    php artisan make:model TicketTemplates -m
    php artisan make:model Tickets -m
    php artisan make:model UserMeta -m
    php artisan make:model Orders -m
    php artisan make:model OrderItems -m
    php artisan make:model CheckIns -m
    php artisan make:model Reviews -m
    
    모든 모델 및 마이그레이션에 UUID를 추가합니다.메타 테이블을 종료할 수 있지만, 안전한 목적으로 주문서와 이벤트 같은 것은 UUID가 있어야 합니다.
    모델 예:
    <?php
    
    namespace SeshSource;
    
    use SeshSource\Traits\Uuids;
    use Illuminate\Database\Eloquent\Model;
    
    class EventMeta extends Model
    {
        use Uuids;
    
        /**
         * Indicates if the IDs are auto-incrementing.
         *
         * @var bool
         */
        public $incrementing = false;
    }
    
    마이그레이션 예:
    class CreateEventMetaTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('event_meta', function (Blueprint $table) {
                $table->uuid('id'); 
                $table->primary('id');
                $table->timestamps();
            });
        }
    }
    
    데이터베이스를 재설정하고 새 구조를 마이그레이션하려면 다음과 같이 하십시오.docker-compose exec workspace php artisan migrate:fresh

    If you have any issues with "foreign IDs", it probably means a migration with relationships was run before the related table was created. Rename your migrations to make sure any tables that are related are created before any pivot tables.



    사용자 모델을 사용하여 인증
    이전하는 과정에서 사용자 테이블에 'type' database/migrations/2014_10_12_000000_create_users_table.php 을 추가했습니다.여기서 우리는 로그인 사용자가 고객, 활동 조직자인지 관리자인지 판단할 수 있다.사용자가 관리자 또는 조직자 수준의 기능에 액세스할 수 있는지 쉽게 확인할 수 있도록 사용자 모델에 각 기능에 대한 체크가 추가되었습니다.
       /**
         * Determines if user is admin or not (true or false)
         *
         * @return boolean
         */
        public function isAdmin() 
        {
            if($this->type == 'admin')
            {
                return true;
            } else {
                return false;
            }
        }
    
        /**
         * Determines if user is organizer or not (true or false)
         *
         * @return boolean
         */
        public function isOrganizer() 
        {
            if($this->type == 'organizer')
            {
                return true;
            } else {
                return false;
            }
        }
    

    API 컨트롤러 생성
    현재 우리는 응용 프로그램의 컨트롤러 부분을 처리할 수 있는 모델이 이미 생겼다.현재 5개의 컨트롤러가 필요하며 Larravel의 artisan CLIAPI resource controllers를 사용합니다.이것은 표준 API(인덱스, 저장, 업데이트, 삭제)에 필요한 모든 방법을 제공하는 컨트롤러를 안내합니다.
    php artisan make:controller 'Api/EventsController' --api
    php artisan make:controller 'Api/UsersController' --api
    php artisan make:controller 'Api/ReviewsController' --api
    php artisan make:controller 'Api/OrdersController' --api
    php artisan make:controller 'Api/CheckInsController' --api
    
    색인 방법에 대해 우리는 적당한 모델과 페이지 나누기 방법만 사용한다(Events::paginate(10).잠시 후, 우리는 조회 파라미터를 사용하여 필터를 추가할 것입니다. (순서 변경, 분류 지정 등)
    show 방법에 대해 우리는 다시 적당한 모델을 사용하고 findOrFail() 방법으로 $id:$event = Events::findOrFail($id);을 얻는다.

    To return a JSON response using Laravel, just use the json() method on the response() object: return response()->json($events);

    store() 방법에 대해 우리는 모든 방법php artisan make:request StoreEvents에 인증서를 생성합니다.검증기는 POST 요청을 검사하고 사용자 모델의authorize() 방법으로 isAdmin() 방법 중의 사용자를 인증한다.
    <?php
    
    namespace SeshSource\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class StoreEvents extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return $this->user()->isAdmin();
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'title' => 'required|unique:events|max:255',
                'start_date' => 'required|date',
                'end_date' => 'required|date',
                'street_address' => 'required',
                'city' => 'required',
                'state' => 'required',
                'email' => 'email',
                'event_logo' => 'image',
                'featured_img' => 'image'
            ];
        }
    }
    

    Passport에서 UUID 사용자 ID가 지원되지 않습니다.
    OAuth2에 대한 클라이언트 ID를 만들 때 문제가 발생하면 여기에 빠른 해결 방법이 있습니다.0개의 인증된 Passport 응용 프로그램
    사용자 ID를 증가 정수가 아닌 UUID로 바꾸었기 때문에 Passport에서 UUID가 아닌 증가 ID를 참조하는 테이블oauth_access_tokens을 만들었습니다.작업을 하기 위해서, 우리는 새 이전을 만들고, 열을 삭제하고, 새 열을 만들어야 한다.

    Normally we'd just update the column, but the doctrine\dbal library used by Laravel doesn't support UUIDs.

  • 사용자 id 열을 삭제합니다(Laravel의 dbal 의존 항목이 uuid로 변경할 수 없기 때문). php artisan make:migration drop_user_id_on_oauth_access_tokens:
  • <?php
    
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class DropUserIdOnOauthAccessTokens extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::table('oauth_access_tokens', function (Blueprint $table) {
                $table->dropColumn('user_id');
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::table('oauth_access_tokens', function (Blueprint $table) {
                $table->dropColumn('user_id');
            });
        }
    }
    
    
  • 마이그레이션을 추가하여 사용자 ID 열을 UUIDphp artisan make:migration update_oauth_access_tokens_with_uuids로 삽입합니다.
  • <?php
    
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class UpdateOauthAccessTokensWithUuids extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::table('oauth_access_tokens', function (Blueprint $table) {
                $table->uuid('user_id')->change();
                $table->primary('user_id')->change();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::table('oauth_access_tokens', function (Blueprint $table) {
                $table->integer('user_id')->change();
            });
        }
    }
    
    데이터베이스를 재설정하고 새 구조를 마이그레이션하려면 다음과 같이 하십시오.docker-compose exec workspace php artisan migrate:fresh
    Enable CORS
    CORS 종속성을 설치하고 커널에 추가합니다.php.이렇게 하면 동일한 서버에서 응용 프로그램을 생성하고 API와 통신을 활성화할 수 있습니다.이 API를 실행하면 이 API가 http://localhost/에 배치됩니다.우리가 전방에 React 응용 프로그램 (데이터 표시) 을 만들 때 http://localhost:3000 에 배치할 것입니다.동일한 서버에 있지만 포트가 다르기 때문에 도메인 간 참조 오류가 발생합니다.

    Enabling CORS on the API endpoints allows us anyone to access the API on any server. So if you're going to deploy to production, make sure to limit the hosts to servers you trust (unless your API is public).



    공기 오염 지수
    이렇게 해서, 당신의 API는 이미 다른 응용 프로그램에 사용될 준비가 되어 있습니다.
    이 시리즈의 다음 부분에서는 NextJS를 사용하여 서버에서 보이는 ReactJS 관리 대시보드를 만들고 Material UI 디자인 스타일을 사용하며 OAuth2 API를 사용하여 인증하는 방법을 모색할 것입니다.한 마디에 단어와 기술이 많아서 이 글 자체도 한 입에 삼킬 수 있는 것은 아니지만 가능한 한 간단하게 할 수 있도록 최선을 다하겠습니다!👍
    기대해주세요!🙈
    Ryo
    참조 자료:
  • Laravel installation
  • http://laradock.io/documentation/
  • https://medium.com/@steveazz/setting-up-uuids-in-laravel-5-552412db2088
  • https://github.com/webpatser/laravel-uuid
  • Naming your Laravel application
  • Quickly creating JWT tokens using Laravel Passport
  • Doctrine doesn't support changing MySQL columns to UUID
  • Enable CORS
  • NextJS login with protected routes example
  • 좋은 웹페이지 즐겨찾기