Share
Embed
GTB2020 Web アプリフレームワーク入門/REST API 入門 スライド/ GTB2020 Web App Framework and REST API Introduction
Futoshi Endo
May 28, 2020
Transcript
271 slides
-
3 GMOペパボ株式会社 EC事業部 カラーミーショップグループ 2014年 入社 牧野 弘幸 (kumak1) 趣味
ゲームを作る・絵を描く 講師紹介 -
8 スケジュールと担当について 講義の進め方について 1日目(2020/05/12 14:00〜19:00) • 座学 2時間30分 (14:00〜16:30) kumak1
• Webについて • ページが表示されるまで • Webアプリケーションについて • Webアプリケーションを作成するにあたって • 開発環境構築 2時間30分 (16:30〜19:00) endu • ConoHa VPSにLaravelを導入する • VSCodeの拡張機能Remote - SSHでConoHa VPSにアクセスする -
9 講義の進め方について スケジュールと担当について 2日目(2020/05/12 10:00〜19:00) • Laravelについて 1時間 (11:00〜11:45) kumak1
• Laravelとは? • Laravelの便利機能 • Laravelのディレクトリ構成 • LaravelをMVCパターンで考えてみる • Laravelを使ってAPIを作成する (12:00〜19:00) endu • アプリケーションをセットアップしよう • アプリケーションをブラウザから見てみよう • APIのCRUDを実装しよう • Validationを実装しよう • ORM のよもやま話 -
19 Web の関連技術はとても扱いやすく、様々なところで利用されています。 - Chrome や Edge などのブラウザで企業やサービスのWebページを見る - オーソドックスな使われ方
- PC・スマホ・テレビといった様々なデバイスから見ることができる - スマホのゲームアプリで通信を行いながら協力プレイをする - ブラウザ以外の様々なアプリもデータのやり取りに利用している Webについて(おさらい) -
20 クライアントとサーバー サービスを提供する側をサーバー、サービスを受ける側をクライアントと呼びます。 (一般的な言葉になりつつありますね) - クライアントの代表例がブラウザ - Google Chrome -
Microsoft Edge、Internet Explorer - Apple Safari - Mozilla Firefox - サーバーとして利用されている代表的なもの - Apache HTTP Server - Nginx (エンジンエックス) - Microsoft IIS (Internet Information Services) - LiteSpeed Web Server -
21 URL と HTTP Web では次の2つがとても重要な要素となります。 - URL (Uniform Resource
Locator) - 「欲しい情報がどこにあるのか」という場所を明確に示す - HTTP (HyperText Transfer Protocol) - URL で示した場所に対して「情報をどうしたいか」を通信で指示する 上記の2つをこれ以降もう少しだけ深掘りします。 -
22 URLとは URL を使うことで「どこになにがあるか」を簡単に示すことができます。 - URL がなかったら - あの企業サーバーの◦◦というカテゴリ下の△△というサブカテゴリをみて! -
とても大変 - URL があったら - https://example.co/◦◦/△△/ をみて! - 場所を指し示すのにシンプルなルールを提供できたので、利用するのがとても 簡単になった -
23 プロトコルとは プロトコルとは通信する際の手順や規格を定めた規約のこと。 プロトコルに従うことで、サーバーとクライアントがネットワークを通じてやり取りでき ます。 - クライアントがサーバーに決められた命令 (1つもしくは複数) を送信すると結果が返る -
Web では URL で示された場所に対して HTTP というプロトコルでやり取りを行う -
24 HTTP の良さ HTTP はそれまであったプロトコルよりかなり単純なものとなっています。 - 以前のプロトコル - SMTP や
POP3/IMAP4 (メールで使用) - FTP (ファイル転送で使用) 等 - 複数の命令を組み合わせて目的の動作を行う - HTTP - (基本的に) 1つの命令で目的を果たせる - プロトコルが単純なため、サーバーやクライアントを実装しやすい HTTP を利用したプロダクトや事例が爆発的に増えました。 -
27 リクエストとレスポンス クライアントとサーバーとのやり取りに対しての用語を説明します。 - リクエスト - クライアントからサーバーに接続し、サービスを提供してもらうための処理を 依頼することを「リクエストを投げる」という - レスポンス
- クライアントからのリクエストを受けて、サーバーで処理を行った結果をクラ イアントに渡すことを「レスポンスを返す」という -
28 HTTP のやり取り 例えば、Yahoo! JAPAN のページを表示するまでを考えてみましょう。 - ブラウザから Yahoo! JAPAN
のWebサーバーにトップページの情報をもらうために、 トップページのURL に対してリクエストを投げる - Webサーバーはトップページのデータを準備して、ブラウザにレスポンスとして HTML ファイルを返す - ブラウザが HTML ファイルを解析すると、CSS や JavaScript、画像といったファイ ルを追加で取得する必要があることが判明する - ブラウザからWebサーバーに 必要なものをもらうために投げる - サーバーからブラウザにリクエストされたものを返す - 以下これの繰り返し -
30 Yahoo! JAPAN のページが見えるまで(その2) ブラウザから Yahoo! JAPAN のWebサーバーにトップページの情報をもらうために、トップページの URL に対してリクエストを投げます。
リクエスト GET https://www.yahoo.co.jp/ HTTP/1.1 Host: www.yahoo.co.jp Connection: keep-alive accept:text/html,application/xhtml+xml,application/xml;q=0.9,im age/webp,image/apng,*/*;q=0.8,application/signed- exchange;v=b3;q=0.9 accept-encoding: gzip, deflate, br accept-language: ja,en-US;q=0.9,en;q=0.8 cookie: ... sec-fetch-dest: document sec-fetch-mode: navigate sec-fetch-site: none sec-fetch-user: ?1 upgrade-insecure-requests: 1 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 -
31 Yahoo! JAPAN のページが見えるまで(その2) ブラウザから Yahoo! JAPAN のWebサーバーにトップページの情報をもらうために、トップページの URL に対してリクエストを投げます。
リクエスト GET https://www.yahoo.co.jp/ HTTP/1.1 Host: www.yahoo.co.jp Connection: keep-alive accept:text/html,application/xhtml+xml,application/xml;q=0.9,im age/webp,image/apng,*/*;q=0.8,application/signed- exchange;v=b3;q=0.9 accept-encoding: gzip, deflate, br accept-language: ja,en-US;q=0.9,en;q=0.8 cookie: ... sec-fetch-dest: document sec-fetch-mode: navigate sec-fetch-site: none sec-fetch-user: ?1 upgrade-insecure-requests: 1 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 GET https://www.yahoo.co.jp/ HTTP/1.1 -
32 Yahoo! JAPAN のページが見えるまで(その2) ブラウザから Yahoo! JAPAN のWebサーバーにトップページの情報をもらうために、トップページの URL に対してリクエストを投げます。
リクエスト GET https://www.yahoo.co.jp/ HTTP/1.1 Host: www.yahoo.co.jp Connection: keep-alive accept:text/html,application/xhtml+xml,application/xml;q=0.9,im age/webp,image/apng,*/*;q=0.8,application/signed- exchange;v=b3;q=0.9 accept-encoding: gzip, deflate, br accept-language: ja,en-US;q=0.9,en;q=0.8 cookie: ... sec-fetch-dest: document sec-fetch-mode: navigate sec-fetch-site: none sec-fetch-user: ?1 upgrade-insecure-requests: 1 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 GET https://www.yahoo.co.jp/ HTTP/1.1 リクエスト メソッド URL HTTPの バージョン -
33 リクエストメソッド リクエストメソッドは、URLに対してどのような処理をしたいのかを示したものです。 - GET - 情報を取得 - 副作用はないように -
POST - 情報を変更 - PUT - 情報を置換 - PATCH - 情報を一部置換 - DELETE - 情報を削除 -
35 Yahoo! JAPAN のページが見えるまで(その4) レスポンス HTTP/1.1 200 OK Cache-Control: private,
no-cache, no-store, must-revalidate Content-Type: text/html; charset=UTF-8 Date: Mon, 20 Apr 2020 06:59:26 GMT Expires: -1 Pragma: no-cache Set-Cookie: B=18kikclf9qi2e&b=3&s=2m; expires=Thu, 21-Apr-2022 06:59:26 GMT; pat h=/; domain=.yahoo.co.jp Vary: Accept-Encoding X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Vcap-Request-Id: 075691ed-bab6-4077-58f0-34523d132299 X-Xss-Protection: 1; mode=block Age: 0 Transfer-Encoding: chunked Connection: keep-alive Via: http/1.1 edge1675.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ]) Server: ATS Set-Cookie: XB=18kikclf9qi2e&b=3&s=2m; expires=Thu, 21-Apr-2022 06:59:26 GMT; pa th=/; domain=.yahoo.co.jp; secure; samesite=none <!DOCTYPE html><html lang="ja">... Webサーバーはトップページのデータを準備して、ブラウザにレスポンスとして html ファイルを返し ます。 -
36 Yahoo! JAPAN のページが見えるまで(その4) レスポンス HTTP/1.1 200 OK Cache-Control: private,
no-cache, no-store, must-revalidate Content-Type: text/html; charset=UTF-8 Date: Mon, 20 Apr 2020 06:59:26 GMT Expires: -1 Pragma: no-cache Set-Cookie: B=18kikclf9qi2e&b=3&s=2m; expires=Thu, 21-Apr-2022 06:59:26 GMT; pat h=/; domain=.yahoo.co.jp Vary: Accept-Encoding X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Vcap-Request-Id: 075691ed-bab6-4077-58f0-34523d132299 X-Xss-Protection: 1; mode=block Age: 0 Transfer-Encoding: chunked Connection: keep-alive Via: http/1.1 edge1675.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ]) Server: ATS Set-Cookie: XB=18kikclf9qi2e&b=3&s=2m; expires=Thu, 21-Apr-2022 06:59:26 GMT; pa th=/; domain=.yahoo.co.jp; secure; samesite=none <!DOCTYPE html><html lang="ja">... Webサーバーはトップページのデータを準備して、ブラウザにレスポンスとして html ファイルを返し ます。 HTTP/1.1 200 OK -
37 Yahoo! JAPAN のページが見えるまで(その4) レスポンス HTTP/1.1 200 OK Cache-Control: private,
no-cache, no-store, must-revalidate Content-Type: text/html; charset=UTF-8 Date: Mon, 20 Apr 2020 06:59:26 GMT Expires: -1 Pragma: no-cache Set-Cookie: B=18kikclf9qi2e&b=3&s=2m; expires=Thu, 21-Apr-2022 06:59:26 GMT; pat h=/; domain=.yahoo.co.jp Vary: Accept-Encoding X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Vcap-Request-Id: 075691ed-bab6-4077-58f0-34523d132299 X-Xss-Protection: 1; mode=block Age: 0 Transfer-Encoding: chunked Connection: keep-alive Via: http/1.1 edge1675.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ]) Server: ATS Set-Cookie: XB=18kikclf9qi2e&b=3&s=2m; expires=Thu, 21-Apr-2022 06:59:26 GMT; pa th=/; domain=.yahoo.co.jp; secure; samesite=none <!DOCTYPE html><html lang="ja">... Webサーバーはトップページのデータを準備して、ブラウザにレスポンスとして html ファイルを返し ます。 HTTP/1.1 200 OK HTTPの バージョン ステータス コード ステータス テキスト -
38 ステータスコード ステータスコードは、サーバーの処理結果を示したものです。 3桁の数値でどのような状態になったかを表します。 - 200番台は処理が成功したことを表す - 200 OK -
201 Created - 300番台は追加の処理が必要であることを表す - 301 Moved Permanently - 302 Found - 307 Temporary Redirect - 308 Permanent Redirect -
39 ステータスコード - 400番台はリクエストに問題があったことを表す - 400 Bad Request - 401
Unauthorized - 認証が必要 - 403 Forbidden - 404 Not Found - 500番台はサーバー側に問題があったことを表す - 500 Internal Server Error - 503 Service Unavailable -
40 ドキュメントルート Web サーバーに関連する用語の補足説明。 - ドキュメントルート - URL (https://<サーバー名>/) のトップ部分と対応するサーバー上のディレクトリのこと
(≒ドキュメントルートにファイルを置くとWebに公開される) - Linux をWebサーバーにセットアップすると /home/www/html がドキュメントルートになる (設定ファイルで変更可能) - レンタルサーバーでは1つのサーバーを複数のお客様が利用するので、お客様のドメイン毎 にドキュメントルートを設定している ドキュメントルートにファイルを無造作に置くと、Webブラウザから簡単にアクセスされてしまう。 このため、見られてはいけないデータは /home/www/data などのドキュメントルート外のディレクトリ に置くようにしましょう。(情報漏えいの一部はドキュメントルートに誤ってファイルを置いたことで発生しま す。) -
41 安全な通信をするために リクエストもレスポンスも単なるテキストなので、そのままでは簡単に中身を見られてし まいます。 - TLS (Transport Layer Security) -
通信相手の認証、通信の暗号化を行うプロトコル - 以前は SSL (Secure Sockets Layer) と呼ばれていた - SSL の古いバージョンで使われていた暗号方式が破られてしまったため、 SSL の上位規約として TLS が作られた - SSL と TLS をまとめて SSL と呼ばれることも多い - HTTPS - SSL/TLS プロトコルで接続の上で HTTP 通信を行うこと - SSL/TLS が使われていない状態だとURLは http://〜 - SSL/TLS が使われている状態では https://〜 になる -
42 特定の誰かだけ利用させたい 提供するコンテンツによっては、会員だけが使えるとか、特定の人だけが使えるといった 制限をしたいことがよくあります。 - 認証 (Authentication) - 誰であるかを確認して、許可された人以外は許さない -
(パスポート持ってるからあなたはNさん。Nさんなら顔パス) - (Twitter へのログインなど) - 認可 (Authorization) - 誰であるかに応じて、どのような権利があるかをコントロールする - (新幹線のチケット持ってるので、乗っていいですよ) - (Twitter 連携アプリの OAuth 2.0 など) 日本語でも似たような用語だし、英語でも両方とも略すと Auth になるので、混同される 事が多いので注意しましょう。 -
45 Web アプリケーションを分類してみる Web アプリケーションとして提供するものは、大きく分けて次の2つがあります。 - Webページを表示するためのアプリケーション - サーバーからは HTML,
JavaScript, CSS, 画像などを返す - 古くから提供されてきたもの - スマホ等から利用されるアプリケーション - スマホアプリ等からアクセスされ、データの取得や更新を行う - 「データをどうやり取りをするか」という決まりをアプリケーション毎に決め て、クライアントとサーバーでやり取りを行う - この決まりのことを API (Application Programming Interface) という 今回の講義ではこの API の実装方法を学びます。 -
46 RESTful API API の設計方法にはいくつかの流儀があります。(RPC や SOAPなど) - Web API
は SOAP (Simple Object Access Protocol) などで提供されていた - システム毎に複雑な仕様書 (XMLの構造など) のやり取りが必要 - 作成するシステムが複雑になりがち - RESTful API - URL が示すものに対して HTTP のメソッドを使って単純にアクセスする - 仕様がシンプルになるので、複数のシステム連携が比較的容易になる 昨今は RESTful API で提供するものが多いです。 -
47 REST という考え方 Web でシステムを構築するにあたって、どのようにすると効率がいいのかという考え方 が HTTP の規約を策定したメンバーの一人である Roy Fielding
によって提唱された。 - REST (REpresentational State Transfer) - 拡張性のある Web システムを構築するためのアーキテクチャスタイル (設計の流儀や様式、作法) - クライアントとサーバーの間を URL と 統一インタフェース (リクエストメソッド) を使って、ステートレス にやり取りすることにより拡張性を高めるようにでき るとした考え - Web および HTTP そのものの原則と言える -
48 CRUD という考え方 CRUD とは、データ操作で使う4つの基本機能のそれぞれの頭文字をとったものです。 これを RESTful API にマッピングすると以下の通りです。 -
Create - データを生成する - POST <URL> - Read - データを読み取る - GET <URL> - Update - データを更新する - PUT <URL> or PATCH <URL> - Delete - データを削除する - DELETE <URL> -
49 返却されるデータの形式 通常のWebアプリケーションでは HTML や JavaScript・CSS などが返却されますが、 API ではそれとは違った形式でデータを返却します。 -
パース - プログラムでデータ (文字列) 解析すること - API で扱うデータはプログラムで処理しやすい形式を選ぶ (HTML や単なる複数行テキストはパースしづらい) - パースしやすいデータ形式 - XML (Extensible Markup Language) - データに対して厳密にタグを付与したデータ形式 - JSON (JavaScript Object Notation) - JavaScript でそのまま利用可能で、その他言語でも扱いやすい - 今回の講義では JSON を取り扱う -
50 XML サンプルコードで比較 データ形式 HTML <!doctype html> <html> <head> <meta
charset="utf-8"> </head> <body> <form> <input type="text" name="key" value="value"> </form> </body> </html> { "key": "value" } <?xml version="1.0" encoding="utf- 8" ?> <key>value</key> JSON -
52 フレームワークとは 明日のハンズオンで作成するWebアプリケーションではフレームワークを利用します。 - フレームワーク(Web アプリケーションフレームワーク) - モノを作成する際、0 から全て作るのはとても大変 -
土台として何割かできあがったモノの上に処理を追加することで、アプリケー ション完成までの手間を少なくするソフトウェア - フレームワーク毎にルールや作法があり、これに従えば比較的簡単にアプリケ ーションを作成できる(逆に言えばフレームワーク毎に癖があり、合わせて作る必要がある) ライブラリとの違い - ライブラリは自分が作成するプログラム から 利用する部品 - 特別な処理を簡単に実現できるよう作成されており、再実装する手間が省ける - フレームワークは自分が作成するプログラム が 利用される部品 -
53 パターン プログラムを設計・実装において「誰もが似た事をしているな」ということがしばしば起 こります。 - パターン - 似たアプリケーションを作成する場合、後々拡張・修正しやすい共通のやり方 が出てくる -
手法や手順に名前をつけ、エンジニア間で共通の語彙として会話ができるよう にしたモノ - アンチパターン - パターンは良いモノばかりではない - 「こういう風にすると良くないよ」と注意喚起するもの フレームワークはこのパターンを多く利用しており、その代表例がMVCパターンです。 -
54 MVCパターン - MVCパターン (Model-View-Controller パターン) - Model、View、Controller の3つのパーツでアプリケーションを作る考え方 -
Controller - 外部からのリクエストを受ける - 処理を Model に依頼して、結果を受け取る - 処理結果を View に渡して、出力結果を受け取る - 出力結果をレスポンスとして返却する - Model - アプリケーションとしての処理を担当する - DBアクセスや外部サービスとのやり取りはここで行う - View - 処理結果をどのようにアウトプットするかを担当する - HTMLの生成や、JSONの生成を行ったりする -
55 MVCパターンの特徴 - MVCパターン は多くのフレームワークに採用されているため応用しやすい - 実装する際「 MVC のどれが担当するか」ということで整理しやすい -
ディレクトリ構成(どこに何を置くか)は悩みのタネになりやすい - ほとんどのフレームワークはディレクトリ構成が決まっており、これに従って 実装するので (比較的) 悩まないで済む 注意点 - MVCの担当を割り振る際、どうしても曖昧な部分ができてしまう - Controller, Model のどちらかの担当範囲は広くなりすぎる傾向がある -
62 リモート接続するためのディレクトリとファイルを生成する ※ここからの作業はMacの方はTerminal、Windowsの方はGit for Windowsで作業をしてください cd ~ #ホームディレクトリに移動 mkdir ~/.ssh
#ディレクトリを生成する touch ~/.ssh/config #設定ファイルを作成する ls -l ~/.ssh/config 最初にシークレットキーを置いておくディレクトリと、リモートサーバーの接続する際に利用され る設定ファイルも生成しておきます。(※既にある場合はここはスキップして大丈夫です) ConoHa VPSにLaravelを導入する -
83 なぜ、VSCodeを使ってConoHa VPSにアクセスする必要があるのか? エディターを使わない場合 • コンソール画面に入りコマンドラインで操作 する為、手間が発生する • viの知識が必要 •
修正箇所を探すのが大変 VSCodeの拡張機能 Remote-SSHでConoHa VPSにアクセスする -
84 なぜ、VSCodeを使ってConoHa VPSにアクセスする必要があるのか? • GUIで楽に操作できる • 自動でインデントや補完をしてくれるの で、編集が楽 • 拡張機能を入れて自分好みにカスタマイ
ズできる エディターを使う場合 VSCodeの拡張機能 Remote-SSHでConoHa VPSにアクセスする -
86 これから行う具体的な手順 ① VSCodeにRemote-SSHをインストールする ② リモート接続するための設定ファイルにConoHa VPSの設定を記述する ③ VSCodeからConoHa VPSに接続する
④ VSCodeのターミナル画面からConoHa VPS上でコマンドライン操作できるようにする VSCodeの拡張機能 Remote-SSHでConoHa VPSにアクセスする -
93 ② リモート接続するための設定ファイルにConoHa VPSの設定を記述する Host Conoha HostName {IPアドレス} User root
Port 22 IdentityFile {秘密鍵が置いてあるパスを指定する} VSCodeの拡張機能 Remote-SSHでConoHa VPSにアクセスする -
96 ② リモート接続するための設定ファイルにConoHa VPSの設定を記述する Host Conoha HostName {IPアドレス} User root
Port 22 IdentityFile {秘密鍵が置いてあるパスを指定する} VSCodeの拡張機能 Remote-SSHでConoHa VPSにアクセスする -
100 ③ VSCodeからConoHa VPSに接続する VSCodeのエクスプローラーからConoHa VPS上のLaravelがインストールされているディレクトリ を開きます。 コマンドパレットにLaravelがインストールされているパスを指定します。 cd /var/www/html/laravel/
VSCodeの拡張機能 Remote-SSHでConoHa VPSにアクセスする -
104 「リモート」を選択してAutomation Shell:Linuxの下にあるsetting.jsonで編集を開いて、bashの パスを指定します。 ConoHa VPSでは/usr/bin/配下にbashがあります。 { "terminal.integrated.shell.linux": "/usr/bin/bash" }
VSCodeの拡張機能 Remote-SSHでConoHa VPSにアクセスする ④ VSCodeのターミナル画面からConoHa VPS上でコマンドライン操作でき るようにする -
105 この状態で保存をしてターミナルを開くと、ConoHa VPS上に接続した状態でサーバのターミナル を操作する事ができます。 試しにphp artisan -Vで確認してみましょう。 VSCodeの拡張機能 Remote-SSHでConoHa VPSにアクセスする
④ VSCodeのターミナル画面からConoHa VPS上でコマンドライン操作できる ようにする -
112 Laravelの紹介 Laravelとは? - PHPで書かれたフレームワーク - 公式ドキュメント https://laravel.com/ - 日本語訳まとめサイト
https://readouble.com/laravel/ - バージョンについて - v1 は2011年6月提供開始。最新バージョンは 7.X(2020/4 現在) - 半年毎にメジャーバージョンアップ - LTS(Long Term Support)のリリースは2年毎 - バグフィックスは2年間継続 - セキュリティフィックスは3年間継続 今回の講義では Laravel6.X(最新のLTS)を使用します。 -
114 フレームワークとは(復習) 明日のハンズオンで作成するWebアプリケーションではフレームワークを利用します。 - フレームワーク(Web アプリケーションフレームワーク) - モノを作成する際、0 から全て作るのはとても大変 -
土台として何割かできあがったモノの上に処理を追加することで、アプリケー ション完成までの手間を少なくするソフトウェア - フレームワーク毎にルールや作法があり、これに従えば比較的簡単にアプリケ ーションを作成できる(逆に言えばフレームワーク毎に癖があり、合わせて作る必要がある) ライブラリとの違い - ライブラリは自分が作成するプログラム から 利用する部品 - 特別な処理を簡単に実現できるよう作成されており、再実装する手間が省ける - フレームワークは自分が作成するプログラム が 利用される部品 -
116 Webアプリケーションに必要な機能とは? Laravelとは? - DBと接続・データ取得(MVCのM) - テンプレートエンジン(MVCのV) - ルーティング -
ログイン認証処理 - 基本的なセキュリティ - セッション管理 といった機能が必要になります。 -
117 様々な言語で提供されるフレームワーク Laravelとは? - CakePHP(PHP) - Ruby on Rails(Ruby) -
Django(Python) - Spring Framework(Java) などなど、様々な言語で、多くのフレームワークが用意されています。 それぞれに設計思想や特徴があるので、興味のある人は調べてみましょう。 -
118 参考:Ruby on Railsが与えた影響 Laravelとは? - Ruby on Rails (Ruby製のWebアプリケーションフレームワーク)
- 2004年に発表されその後人気になった - 簡単にWebアプリケーションが作れる - オブジェクト指向 - MVCアーキテクチャ Webアプリケーションが簡単に作れるようになった これ以降に出てきたフレームワーク(Laravelも含む)は、 Ruby on Railsの影響を大きく受けている -
121 フレームワークを使うメリット Laravelとは? 簡単に、安全に、短く書くことが可能になります。 - 規約が用意されている - 規約に添うことで開発者ごとのコーディングのバラ付きが抑えられる - コードが構造化されている
- MVCパターン、リポジトリパターンなど - 保守性向上 - 便利なモノが用意されている - コマンドラインインターフェイス、ORMなど - 開発スピードアップ -
122 フレームワークを使うデメリット Laravelとは? - 学習コストが増える - フレームワークのお作法の習得が必要(言語のお作法と別に) - 例:コマンドラインインターフェイス、ORMの記法、ルーティングなど -
フレームワークの知識に偏ってしまう - 細かい仕組みを理解せずにアプリケーションが作れてしまうので、 ブラックボックス化しやすい - カスタマイズしづらい(スクラッチと比べ) - アプリケーションの規模に対して冗長になる場合がある -
124 Artisan について Laravelの便利機能 - Laravelのコマンドラインインターフェイス - https://readouble.com/laravel/6.x/ja/artisan.html - Artisan
= 職人という意味 - php artisan ~ という記法で様々なコマンドを実行できる -
125 Artisanコマンドの例 コマンド 処理内容 php artisan -v Laravelのバージョンの確認 php artisan
list コマンド一覧を確認できる php artisan <実行コマンド> -h コマンドの使い方を確認できる php artisan make:controller FooController Fooコントローラーを作成する php artisan make:model Foo Fooモデルを作成する php artisan make:migration create_tests_table -- create=tests create_tests_table=ファイル名、tests=テーブル名で マイグレーションファイルを作成する php artisan migrate マイグレーションの実行 php artisan migrate:rollback マイグレーションのロールバック php artisan route:list ルーティングの一覧を表示 php artisan tinker REPLの起動(ちょっとしたデバッグとかに便利) -
126 マイグレーションについて Laravelの便利機能 - 移動・移行という意味。(wikipediaより引用) - ここではデータベースマイグレーションのこと - DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更な どを行うための機能
マイグレーションのメリット - SQL文を作成して実行しなくても、簡単にテーブルを定義できる - テーブルの設計をコードで管理できる(マイグレーションファイル) - データベースがバージョンファイルにより管理される - 複数人での開発作業もやりやすくなる -
127 .envファイルについて Laravelの便利機能 - アプリケーションで使う各種設定が含まれる - データベースの接続設定 - アプリケーション固有の環境変数(APP_KEYなど) -
開発環境や本番環境の切り替え - リストした値はPHPのスーパーグローバル変数へロードされる - 秘匿情報などを外部からアクセスできない形で保持できる .envファイルはGitHubなどにアップロードしてはいけません -
130 ディレクトリの構成の一部(Laravel) Laravelの構成 - MVCのディレクトリ - app/ Modelのファイルが含まれる(諸説ある) - app/Http/Controller
Controllerのファイルが含まれる - app/resources/views Viewのファイルが含まれる - そのほかのディレクトリ - app/Console/Commands Artisanの独自カスタムコマンド - routes/ ルート定義ファイル - database/ DBのマイグレーション・初期値設定ファイルなど - tests/ テスト - vendor/ ライブラリなど(composer による依存パッケージ解決) ※フレームワークによってディレクトリ構成は異なります。 -
133 MVCパターン(復習) - MVCパターン (Model-View-Controller パターン) - Model、View、Controller の3つのパーツでアプリケーションを作る考え方 -
Controller - 外部からのリクエストを受ける - 処理を Model に依頼して、結果を受け取る - 処理結果を View に渡して、出力結果を受け取る - 出力結果をレスポンスとして返却する - Model - アプリケーションとしての処理を担当する - DBアクセスや外部サービスとのやり取りはここで行う - View - 処理結果をどのようにアウトプットするかを担当する - HTMLの生成や、JSONの生成を行ったりする -
134 MVCパターンの特徴(復習) - MVCパターン は多くのフレームワークに採用されているため応用しやすい - 実装する際「 MVC のどれが担当するか」ということで整理しやすい -
ディレクトリ構成(どこに何を置くか)は悩みのタネになりやすい - ほとんどのフレームワークはディレクトリ構成が決まっており、これに従って 実装するので (比較的) 悩まないで済む 注意点 - MVCの担当を割り振る際、どうしても曖昧な部分ができてしまう - Controller, Model のどちらかの担当範囲は広くなりすぎる傾向がある -
138 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ GET /clothes ① 「/clothes」を元にControllerに遷移します。 服の一覧 を見たい -
139 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ GET /clothes ② Controller側で「服の一覧を取得する」処理を呼び出します。 服の一覧 を見たい -
140 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ GET /clothes ③DBからデータを取得したいので、Modelに遷移します。 服の一覧 を見たい -
141 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ GET /clothes ④DBから必要なデータをModel経由で取得します。 服の一覧 を見たい -
142 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ GET /clothes ⑤受け取ったデータをControllerに返します。 服の一覧 を見たい -
143 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ GET /clothes ⑥受け取ったデータをViewに渡してレスポンスで返す形に加工します。 服の一覧 を見たい -
144 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ GET /clothes ⑦Controller側からレスポンスをクライアントに返す。 服の一覧 を見たい 服の一覧ページをレスポンスで返す -
145 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ 服の一覧 を見たい MVCパターンの流れ -
146 ディレクトリの構成の一部(Laravel) Laravelの構成 - MVCのディレクトリ - app/ Modelのファイルが含まれる(諸説ある) - app/Http/Controller
Controllerのファイルが含まれる - app/resources/views Viewのファイルが含まれる - そのほかのディレクトリ - app/Console/Commands Artisanの独自カスタムコマンド - routes/ ルート定義ファイル - database/ DBのマイグレーション・初期値設定ファイルなど - tests/ テスト - vendor/ ライブラリなど(composer による依存パッケージ解決) ※フレームワークによってディレクトリ構成は異なります。 -
154 ターミナルでよく使うコマンド 講義の進め方について ターミナル上でディレクトリを移動したりします。 そのために知っておくべきコマンドを載せておきます。 他にもオプションなどありますが、基本はこの4つのコマンドを使うと覚えておいてくだ さい cd # ディレクトリ移動
cd .. # 1つ上のディレクトリ階層に戻る ls # ファイル一覧を表示 pwd # 現在のディレクトリを表示 -
156 ConoHa VPSに教材をダウンロードしよう アプリケーションをセットアップしよう git をインストール sudo yum -y install
git git --version git version 1.8.3.1 git がインストールされているか確認 -
157 cd /var/www/html ConoHa VPSに教材をダウンロードしよう アプリケーションをセットアップしよう git clone https://github.com/tosite0345/gtb2020-laravel.git 教材をダウンロード
ディレクトリを移動・確認 cd /var/www/html/gtb2020-laravel pwd /var/www/html/gtb2020-laravel ディレクトリ移動 -
158 ConoHa VPSに教材をダウンロードしよう アプリケーションをセットアップしよう sh init.sh セットアップ実行 php artisan -V
Laravel Framework 6.18.3 バージョン確認 -
164 アプリケーションをセットアップしよう ①MariaDBにログインしてDatabaseを作成 mysql -uroot -p Enter password: # laravelという名前のDBを作成する
CREATE DATABASE laravel; # DBがちゃんと作られているか確認 SHOW DATABASES; # mysqlから抜ける exit; DBの名前はlaravelでつくります。 -
171 アプリケーションをセットアップしよう ③マイグレーションを実行する pwd /var/www/html/gtb2020-laravel #これが表示される事を確認してください。 # ディレクトリ確認 # マイグレーションを実行する
php artisan migrate Migration table created successfully. Migrating: 2020_04_13_024636_create_comments_table Migrated: 2020_04_13_024636_create_comments_table (0.05 seconds) -
172 アプリケーションをセットアップしよう ③マイグレーションを実行する USE laravel; SHOW TABLES; # MariaDBログイン(初日にメモしておいたMySQLのパスワードを使います) mysql
-uroot -p Enter password: # tableを確認 -
183 データを全表示 API Testerを使ってみよう 画面入力 SUBMIT をクリック Selected Method get
Uri /api/comments Parameters なし -
184 API Testerを使ってみよう 画面入力 SUBMIT をクリック Selected Method get Uri
/api/comments Parameters なし 200 (データ表示に成功) データを全表示 -
188 データを追加してPOSTでリクエストすると失敗するか確認しよう API Testerを使ってみよう 画面入力 SUBMIT をクリック Selected Method post
Uri /api/comments Parameters name: 自由 content: 自由 -
189 API Testerを使ってみよう 画面入力 SUBMIT をクリック 405 エラー データを追加してPOSTでリクエストすると失敗するか確認しよう Selected
Method post Uri /api/comments Parameters name: 自由 content: 自由 -
195 CRUD の C(reate)。ルーティングに追加 APIのCRUDを実装しよう <?php use Illuminate¥Http¥Request; Route::middleware('api')->group(function ()
{ Route::delete('logs', function () { exec(': > ../storage/logs/laravel.log'); }); Route::get('comments', 'CommentController@index'); Route::post('comments', 'CommentController@store'); }); routes/api.php を VSCodeで開いてみよう -
196 CRUD の C(reate) ルーティングに追加してレスポンスが返ってくるか確認 APIのCRUDを実装しよう 画面入力 SUBMIT をクリック Selected
Method post Uri /api/comments Parameters name: 自由 content: 自由 -
197 APIのCRUDを実装しよう 画面入力 SUBMIT をクリック 200 (ルーティングに成功) CRUD の C(reate)
ルーティングに追加してレスポンスが返ってくるか確認 Selected Method post Uri /api/comments Parameters name: 自由 content: 自由 -
201 Model を artisan コマンドで作成 APIのCRUDを実装しよう pwd /var/www/html/gtb2020-laravel #これが表示される事を確認してください。 php
artisan make:model Comment # 成功 Model created successfully. ターミナルで下記のコマンドを実行しよう -
203 MVCパターンの特徴(復習) Route Controller Model DB View ① ② ③
④ ⑤ ⑥ ⑦ 服の一覧 を見たい MVCパターンの流れ -
204 APIのCRUDを実装しよう <?php namespace App; use Illuminate¥Database¥Eloquent¥Model; class Comment extends
Model { protected $fillable = [ 'name', 'content', ]; } app/Comment.php をVSCodeで開いてみよう Model に $fillable を追加して、nameとcontentを追加する -
205 CRUD の C(reate)。Controller に store の処理を追加 APIのCRUDを実装しよう public function
store(¥App¥Http¥Requests¥Comments¥Post $request) { $comment = Comment::create([ 'name' => $request->input('name'), 'content' => $request->input('content'), ]); return response()->json($comment, 201); } app/Http/Controllers/CommentController.php をVSCodeで開いてみよう -
206 画面入力 SUBMIT をクリック CRUD の C(reate)。再実行 APIのCRUDを実装しよう Selected Method
post Uri /api/comments Parameters name: 自分 content: 自由 201 (DBにレコード追加) -
207 画面入力 SUBMIT をクリック CRUD の C(reate)。再実行 APIのCRUDを実装しよう Selected Method
post Uri /api/comments Parameters name: 自分 content: 自由 id を控えておく -
208 画面入力 SUBMIT をクリック CRUD の C(reate)。再実行 APIのCRUDを実装しよう Selected Method
post Uri /api/comments Parameters name: 自分 content: 自由 id を控えておく -
212 CRUD の R(ead)。ルーティングに追加 APIのCRUDを実装しよう <?php use Illuminate¥Http¥Request; Route::middleware('api')->group(function ()
{ Route::delete('logs', function () { exec(': > ../storage/logs/laravel.log'); }); Route::get('comments', 'CommentController@index'); Route::post('comments', 'CommentController@store'); Route::get('comments/{comment}', 'CommentController@show'); }); routes/api.php を VSCodeで開いてみよう -
213 CRUD の R(ead)。Controller に show の処理を追加 APIのCRUDを実装しよう public function
show($id) { return Comment::findOrFail($id); } app/Http/Controllers/CommentController.php をVSCodeで開いてみよう -
214 画面入力 SUBMIT をクリック CRUD の R(ead)。実行 APIのCRUDを実装しよう Selected Method
get Uri /api/comments/{id の番号} Parameters -
215 画面入力 SUBMIT をクリック CRUD の R(ead)。実行 APIのCRUDを実装しよう Selected Method
get Uri /api/comments/{id の番号} Parameters create したデータが表示 -
220 ORMについて簡単に紹介 ORMのよもやま話 ORMとはObject-Relational Mappingの略称です。 LaravelではEloquentと呼ばれるORMが使われています。RailsではActive Recordが使われています。 public function show($id)
{ return Comment::findOrFail($id); } app/Http/Controllers/CommentController.php をVSCodeで開いてみよう ここでは Comment クラスがORMの役割を果たしています。 参考資料:「Eloquent:利用の開始」https://readouble.com/laravel/7.x/ja/eloquent.html -
222 SQLを書かず直感的にDBを操作する事ができる。 ORMのよもやま話 SQL ORM App¥Comment::all(); App¥Comment::where(‘id’, 1)->get(); SELECT *
FROM comments; SELECT * FROM comments where id = 1; データを取得する場合の例(SELECT) -
223 SQLを書かず直感的にDBを操作する事ができる。 ORMのよもやま話 SQL ORM (new Comments())->fill($request->input())->save(); INSERT INTO comments
VALUE ( name = ‘tosite’, content = ’body text’, email = ’[email protected]’ ); データを保存する場合の例(INSERT) -
224 findOrFail ORMのよもやま話 public function show($id) { return Comment::findOrFail($id); }
app/Http/Controllers/CommentController.php をVSCodeで開いてみよう findOrFailメソッドは該当するレコードが見つからない時、自動で404HTTP レスポンスを返してくれます。なのでこのメソッドを使用すればわざわざ明 確に404レスポンスを返すコードを書く必要はありません。 この場合はAPI Testerで存在しないIDを指定してリクエストをすると自動で 404が返ってきます。 -
226 リレーションを使った操作が楽 class Comment extends Model { public function user()
{ return $this->hasOne('App¥User'); } } hasOne = 1:1 hasMany = 1:N belongTo = N:1 belongsToMany = N:N ORMのよもやま話 CommentモデルとUserモデルが1対1の関係になっている (※commentsテーブル内にuser_idを保持している場合) -
227 ORMのよもやま話 Comment::user->name; SELECT user.name FROM comments LEFT JOIN user
ON comments.user_id = user.id SQL ORM リレーションを使った操作が楽 -
228 セキュリティ対策 ORMのよもやま話 SQL + PHP ORM (new Comments())->fill($request->input())->save(); $res
= pg_query_params( $dbconn, 'UPDATE comments SET name = $1 WHERE content = $2', array(‘tosite’, ‘body text’) ); -
231 N+1問題を引き起こすケースもある ORMのよもやま話 $comments = Comment::all(); foreach ($comments as $
comment) { echo $comment->user } class Comment extends Model { public function user() { return $this->hasMany('App¥User'); } } ORM -
232 N+1問題を引き起こすケースもある ORMのよもやま話 select * from comments; select * from
users where id = 1; select * from users where id = 2; select * from users where id = 3; . . SQL $comments = Comment::with('user')->get(); foreach ($comments as $ comment) { echo $comment->user } ※ORM側で対策は可能 $comments->user が実行される度にSQLが発行されてしまい、処理が重くなってしまいます。 -
237 CRUD の U(pdate)。ルーティングに追加 APIのCRUDを実装しよう <?php use Illuminate¥Http¥Request; Route::middleware('api')->group(function ()
{ Route::delete('logs', function () { exec(': > ../storage/logs/laravel.log'); }); Route::get('comments', 'CommentController@index'); Route::post('comments', 'CommentController@store'); Route::get('comments/{comment}', 'CommentController@show'); Route::put('comments/{comment}', 'CommentController@update'); }); routes/api.php をVSCodeで開いてみよう -
238 CRUD の U(pdate)。Controller に update の処理を追加 APIのCRUDを実装しよう public function
update(¥App¥Http¥Requests¥Comments¥Put $request, $id) { $comment = Comment::findOrFail($id); $comment->update([ 'name' => $request->input('name') ?: $comment->name, 'content' => $request->input('content') ?: $comment->content, ]); return response()->json($comment, 200); } app/Http/Controllers/CommentController.php をVSCodeで開いてみよう -
239 CRUD の U(pdate)。 APIのCRUDを実装しよう 画面入力 SUBMIT をクリック Selected Method
put/patch Uri /api/comments/ Parameters name: 自由 -
240 CRUD の U(pdate)。Update Controller を追加 APIのCRUDを実装しよう 画面入力 SUBMIT をクリック
Selected Method put/patch Uri /api/comments/ Parameters name: 自由 200 name が更新される -
244 CRUD の D(elete)。ルーティングに追加 APIのCRUDを実装しよう <?php use Illuminate¥Http¥Request; Route::middleware('api')->group(function ()
{ Route::delete('logs', function () { exec(': > ../storage/logs/laravel.log'); }); Route::get('comments', 'CommentController@index'); Route::post('comments', 'CommentController@store'); Route::get('comments/{comment}', 'CommentController@show'); Route::put('comments/{comment}', 'CommentController@update'); Route::delete('comments/{comment}', 'CommentController@destroy'); }); routes/api.php をVSCodeで開いてみよう -
245 CRUD の D(elete)。Controller に destroy の処理を追加 APIのCRUDを実装しよう public function
destroy($id) { Comment::findOrFail($id)->delete(); return response()->noContent(); } app/Http/Controllers/CommentController.php をVSCodeで開いてみよう -
246 CRUD の D(elete)。Delete Controller を追加 APIのCRUDを実装しよう 画面入力 SUBMIT をクリック
Selected Method delete Uri /api/comments/34 Parameters -
250 CRUD の R(ead)。Controller に show の処理を追加 APIのCRUDを実装しよう public function
index() { return [ ['name' => 'tom', 'content' => 'hello'], ['name' => 'sam', 'content' => 'world'], ]; return Comment::all(); } app/Http/Controllers/CommentController.php をVSCodeで開いてみよう -
251 API 実行してみよう - データを全表示 APIのCRUDを実装しよう 画面入力 SUBMIT をクリック Selected
Method get Uri /api/comments Parameters -
252 API 実行してみよう - データを全表示 APIのCRUDを実装しよう 画面入力 SUBMIT をクリック Selected
Method get Uri /api/comments Parameters 200 (データ表示に成功) -
259 画面入力 SUBMIT をクリック Validation に引っかかるようにAPIを実行してみよう Validation を実装しよう Selected Method
post Uri /api/comments Parameters name: 自分 content: -
260 画面入力 SUBMIT をクリック Validation に引っかかるようにAPIを実行してみよう Validation を実装しよう Selected Method
post Uri /api/comments Parameters name: 自分 content: 422 The content field is required. -
261 今のValidation の実装をみてみよう Validation を実装しよう public function rules() { return
[ 'name' => 'required', // nameパラメータは必須 'content' => 'required', // contentパラメータは必須 ]; } app/Http/Request/Comments/Post.php をVSCodeで開いてみよう -
262 Validation のドキュメントをみてルール追加しよう Validation を実装しよう public function rules() { return
[ 'name' => 'required|min:5|max:10', 'content' => 'required', ]; } min:値 = フィールドが最小値として指定された値以下であることをバリデートします。 max:値 = フィールドが最小値として指定された値以上であることをバリデートします。 参考資料バリデーションについて https://readouble.com/laravel/7.x/ja/validation.html -
263 画面入力 SUBMIT をクリック nameに4文字または11文字の文字列入れて失敗するのを確認し てください Validation を実装しよう Selected Method
post Uri /api/comments Parameters name:aaaa or aaaaaaaaaaa content: 自由 422 The content field is required. -
268 ハンズオンで接続できない方がいたので、問題切り分けして挑みましょう。 確認 : CUI で ConoHa に ssh 接続できますか?
- できる (VS Code のセットアップの問題かも) - Remote-SSH を一旦アンインストール・インストールしよう - VS Code を一旦アンインストール・インストールしよう - できない (ConoHa のセットアップの問題かも) - 公開鍵をサーバーに登録しよう - 秘密鍵を改めてChromeでダウンロードしよう (原因確率は低) VS Code で Remote-SSH で ConoHa に接続できない -
269 確認 : CUI で ConoHa に ssh 接続できますか? VS
Code で Remote-SSH で ConoHa に接続できない ssh Conoha .ssh/config の設定は皆できましたね。 Mac の方は Terminal 、 Windows の方は Git Bash で ssh できるか確認しましょう。 実行するコマンド (.ssh/config に登録した Hostname が Conoha の場合) 実行結果 (接続できた場合) -
270 コマンドを実行して公開鍵を登録します。事前に以下の3つを確認しましょう。 - 秘密鍵のPath (.ssh/config に書いてあるよ) - ConoHaのIP (.ssh/config に書いてあるよ)
- ConoHaのrootパスワード 秘密鍵が利用でき、公開鍵を生成できるか確認するコマンド 公開鍵をサーバーに登録しよう VS Code で Remote-SSH で ConoHa に接続できない ssh-keygen -y -f <秘密鍵のPath> -
271 公開鍵を生成できることを確認したら、ConoHa に登録しましょう。 実行するコマンド 実行したらrootパスワードを聞かれるので、入力してEnterキーを押します。 問題なさそうであれば、再びConoHaにssh接続してみよう 公開鍵をサーバーに登録しよう VS Code で
Remote-SSH で ConoHa に接続できない ssh-keygen -y -f <秘密鍵のPath> | ssh root@<ConoHaのIP> 'cat >> .ssh/authorized_keys'