Slide 1

Slide 1 text

Webシステム開発事例 と GraphQL Server with Laravel 2019-11-30 atomita

Slide 2

Slide 2 text

琉球インタラクティブとは?

Slide 3

Slide 3 text

「日本を代表するインターネット企業になる」 を掲げ 求人マッチングサービス運営や、主に沖縄企業 を対象としたプロモーションプランニング、受 託開発などを手がけ 1つ1つの事業を成長させつつ、新しい事業にも 挑戦

Slide 4

Slide 4 text

Webシステム開発事例

Slide 5

Slide 5 text

御菓子御殿 お取り寄せショップ https://www.okashigoten.com/ 那覇空港旅客ターミナル オフィシャルサイト https://www.naha-airport.co.jp/ JOB ANTENNA https://www.jobantenna.jp/ ほかにもご興味ある方はこちら

Slide 6

Slide 6 text

PHP >> Node.js >> Go > Python

Slide 7

Slide 7 text

LaravelでGraphQL

Slide 8

Slide 8 text

https://github.com/search? q=laravel+graphql&type=Repositories folkloreinc/laravel-graphql nuwave/lighthouse rebing/graphql-laravel

Slide 9

Slide 9 text

Lighthouse-phpの良いところ

Slide 10

Slide 10 text

GraphQL Schema Definition Languageで schemaを定義 簡単にEloquent Model(ORM)と連携 Validationや、アクセス制限はLaravelの機能を 利用

Slide 11

Slide 11 text

Demo

Slide 12

Slide 12 text

ご静聴、ありがとうございまし た

Slide 13

Slide 13 text

おまけ

Slide 14

Slide 14 text

wget https://github.com/laradock/laradock/archive/v8.0.zip unzip v8.0.zip mv laradock-8.0 laradock cp laradock/env-example laradock/.env sed -i -e 's/^\(APP_CODE_PATH_HOST=\).*$/\1..\/laravel/' laradock/.env sed -i -e 's/^\(DATA_PATH_HOST=\).*$/\1..\/data/' laradock/.env sed -i -e 's/^\(COMPOSE_PROJECT_NAME=\).*$/\1laradock_techplay20191130/' laradock/.env sed -i -e 's/^\(MYSQL_VERSION=\).*$/\15.7/' laradock/.env wget https://github.com/laravel/laravel/archive/v6.5.2.zip unzip v6.5.2.zip mv laravel-6.5.2 laravel cp laravel/.env.example laravel/.env sed -i -e 's/^\(DB_HOST=\).*$/\1mysql/' laravel/.env sed -i -e 's/^\(DB_DATABASE=\).*$/\1default/' laravel/.env sed -i -e 's/^\(DB_USERNAME=\).*$/\1default/' laravel/.env sed -i -e 's/^\(DB_PASSWORD=\).*$/\1secret/' laravel/.env (cd laradock; docker-compose up nginx mysql workspace) & (cd laradock; docker-compose exec --user=laradock workspace bash)

Slide 15

Slide 15 text

composer install php artisan key:generate composer require laravel/ui --dev php artisan ui -n vue --auth php artisan migrate npm install && npm run dev

Slide 16

Slide 16 text

composer require nuwave/lighthouse php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider" --tag=schema php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider" --tag=config sed -i -e 's/\('\''middleware'\''.*\)/\1\n \\Illuminate\\Session\\Middleware\\StartSession::class,/' config/lighthouse.php sed -i -e 's/\('\''middleware'\''.*\)/\1\n \\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse::class,/' config/lighthouse.php sed -i -e 's/\('\''middleware'\''.*\)/\1\n \\App\\Http\\Middleware\\EncryptCookies::class,/' config/lighthouse.php composer require mll-lab/laravel-graphql-playground

Slide 17

Slide 17 text

cat << 'EOF' > database/migrations/2019_11_30_000000_create_posts_table.php bigIncrements('id'); $table->text('title'); $table->text('contents'); $table->unsignedBigInteger('user_id')->nullable(); $table->timestamps(); $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('posts'); } } EOF

Slide 18

Slide 18 text

cat << 'EOF' > app/Post.php belongsTo(User::class); } } EOF

Slide 19

Slide 19 text

cat << 'EOF' >> graphql/schema.graphql type Mutation extend type Query { posts: [Post!]! @paginate(defaultCount: 10) post(id: ID @eq): Post @find } type Post { id: ID! title: String! contents: String! created_at: DateTime! updated_at: DateTime! user: User @belongsTo } extend type Mutation { createPost( title: String! contents: String! ): Post @create @inject(context: "user.id", name: "user_id") } EOF

Slide 20

Slide 20 text

php artisan migrate

Slide 21

Slide 21 text

open http://localhost/graphql-playground # setting # "request.credentials": "same-origin" # mutation { createPost(title: "bar" contents: "baz") { id } } # query { posts { data { id title contents created_at updated_at user { id name } } } }