tag:crieit.net,2005:https://crieit.net/tags/svelte/feed
「svelte」の記事 - Crieit
Crieitでタグ「svelte」に投稿された最近の記事
2021-12-23T11:05:29+09:00
https://crieit.net/tags/svelte/feed
tag:crieit.net,2005:PublicArticle/17890
2021-12-23T00:11:52+09:00
2021-12-23T11:05:29+09:00
https://crieit.net/posts/Svelte
Svelte、そのドキュメントは驚きの読みやすさ!的な。
<p>この記事は、<a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/svelte">Svelte Advent Calendar 2021</a>の14日目の投稿が空いているのでは? とおもったので22日の夜にこれから書くぞとおもって勢いで登録した記事です。</p>
<h1 id="Svelte、そのドキュメントは驚きの読みやすさ!的な。"><a href="#Svelte%E3%80%81%E3%81%9D%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AF%E9%A9%9A%E3%81%8D%E3%81%AE%E8%AA%AD%E3%81%BF%E3%82%84%E3%81%99%E3%81%95%EF%BC%81%E7%9A%84%E3%81%AA%E3%80%82">Svelte、そのドキュメントは驚きの読みやすさ!的な。</a></h1>
<p>これはSvelteという、JavaScriptとかHTMLとかCSSとかを一緒に書いたらWebアプリケーションになるやつ※について書かれている、実体験に基づいたドキュメンタリーです。</p>
<p><strong>※ReactとかVueとかAngularが有名だよ</strong></p>
<h2 id="あらすじ"><a href="#%E3%81%82%E3%82%89%E3%81%99%E3%81%98">あらすじ</a></h2>
<p>2021年3月、Vue歴三年(適当)、血の涙を流しながらVueを3にしてjQuery製のアプリケーションをリプレイスしたワイは、もうすでに限界が来とったんや。</p>
<h2 id="新たなる力を求めて"><a href="#%E6%96%B0%E3%81%9F%E3%81%AA%E3%82%8B%E5%8A%9B%E3%82%92%E6%B1%82%E3%82%81%E3%81%A6">新たなる力を求めて</a></h2>
<p>精神に限界を感じたワイは、新たなる力を求めて自然とViteに手を伸ばしたんや。<br />
そしたら、すぐさまボコボコにされた。なぜなら、ViteもVueと同じくEvan Youだったからなんや。<br />
始祖Evan Youの何気ないAPI Referenceがワイの心を傷つけたんやなあ。※</p>
<p><strong>※これはワイの知能がEvan Youのドキュメントパワーを下回っているからなんや。個人の感想なんやで。</strong></p>
<h2 id="Snowpack現る"><a href="#Snowpack%E7%8F%BE%E3%82%8B">Snowpack現る</a></h2>
<p>神Referenceにボコボコにされながら薄れゆく意識の中でワイは見たんや、<a target="_blank" rel="nofollow noopener" href="https://vitejs.dev/guide/comparisons.html#snowpack">Comparisons with Other No-Bundler Solutions ... Snowpack</a>と書いてあるのを。<br />
命からがらViteのページを閉じ、Snowpackのページを開くことで安堵したワイは遂にそこで見てしまったんや、<a target="_blank" rel="nofollow noopener" href="https://www.snowpack.dev/tutorials/svelte">Getting Started with Svelte</a>と書いてあるのを!!!</p>
<h2 id="秘密なんや"><a href="#%E7%A7%98%E5%AF%86%E3%81%AA%E3%82%93%E3%82%84">秘密なんや</a></h2>
<p>ワイはそこでチビってしまった。何をチビッたのかは秘密なんやけどな。なぜなら、そこに書かれている通りに、GettingをStartedしたらSvelteとwithで、簡単にSvelteのロゴマークが画面に表示されてしまったからなんや。<br />
衝撃が脳裏を駆け巡る。<br />
そしてワイはGoing furtherした。</p>
<h2 id="Svelte、それは新たなる宇宙域"><a href="#Svelte%E3%80%81%E3%81%9D%E3%82%8C%E3%81%AF%E6%96%B0%E3%81%9F%E3%81%AA%E3%82%8B%E5%AE%87%E5%AE%99%E5%9F%9F">Svelte、それは新たなる宇宙域</a></h2>
<p>西暦2021年4月、Going furtherしたワイは<a target="_blank" rel="nofollow noopener" href="https://svelte.dev">https://svelte.dev</a>に来ていた。※<br />
※これは後から知ったが<a target="_blank" rel="nofollow noopener" href="https://svelte.jp">日本語訳サイト</a>も存在する。皆はこっちも読もう!</p>
<p>ここでワイはTutorialを読んだ、読みふけった!! なぜなら半日くらいあったら読めるやろとおもって読んだら2日くらい掛かったからなんや。半分寝ながら読み続けた。お忙しい方々ならもっと掛かるかもしれん。それくらい手厚いTutorialになっとるんや。<br />
ほんでな! ほんでな! 画面の左側に書かれてある説明に沿って、画面の右上の画面にコードを書き込んでいくと、画面の右下の画面に結果が表示されるんや!! すごいやろがい!!</p>
<p>※ぜひ実際におためしください。<a target="_blank" rel="nofollow noopener" href="https://svelte.dev/tutorial/basics">https://svelte.dev/tutorial/basics</a></p>
<h2 id="Svelte近接格闘術"><a href="#Svelte%E8%BF%91%E6%8E%A5%E6%A0%BC%E9%97%98%E8%A1%93">Svelte近接格闘術</a></h2>
<p>タイトルに特に意味は無いんや、ちなみにSvelteはスベルトって読むんやで。しらんけど。<br />
こうしてSvelteを身につけたワイはその月のうちに最初の業務アプリケーションを書き、その後もSnowpackで2つSvelteKitで3つのアプリケーションを世に送り出すことができたんや。<br />
SvelteKitについて詳しくはここでは書かんで。なぜならViteを使うとるからな^^。</p>
<h2 id="そのドキュメントは驚きの読みやすさ"><a href="#%E3%81%9D%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AF%E9%A9%9A%E3%81%8D%E3%81%AE%E8%AA%AD%E3%81%BF%E3%82%84%E3%81%99%E3%81%95">そのドキュメントは驚きの読みやすさ</a></h2>
<p>Evan Youのドキュメントにボコボコにされ続けていたワイが、こうも短期間で立て続けにアプリケーションを世に出すことができたのはなんでなんやろか。<br />
それは、おそらく<a target="_blank" rel="nofollow noopener" href="https://svelte.dev">svelte.dev</a>のドキュメントが驚きの読みやすさだったからなんや。※<br />
なんかしらんけど、読んで書いたら動くんや。動かんかったら、また読むんやで。<br />
書けば書くほど動くようになるので、ワイも調子に乗って中高生向けにサンプルコードとかを作って嫌がられたりもした程なんや。良かったら試してな。<br />
<a target="_blank" rel="nofollow noopener" href="https://zenn.dev/fkumnk/articles/ebadd01cd2ca83">中高生に嫌がられた伝説のサンプルコード</a></p>
<p><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/fkumnk/articles/bc8ae4fe43c6cc">中高生に嫌がられた伝説のサンプルコード REST-API編</a></p>
<p><strong>※個人の感想なんやで。</strong></p>
<h2 id="個人の感想のまとめ"><a href="#%E5%80%8B%E4%BA%BA%E3%81%AE%E6%84%9F%E6%83%B3%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81">個人の感想のまとめ</a></h2>
<p>このようにSvelteはめっちゃ学習コストが低いんや。書いたら書いただけ動くしな!<br />
そして、状態管理がめっちゃわかりやすいんや。『ワイでもわかる☆状態管理』なんやで。<br />
でもな、Svelteはまだまだ秘められたポテンシャルが盛り盛りの発展途上プロジェクトなんや。<br />
だからこれからも、皆でガシガシSvelteを書いて積極的に盛り上げていこうな!!</p>
<p>2021年12月22日 ここに記す</p>
<h2 id="SVELTE"><a href="#SVELTE">SVELTE</a></h2>
<p><strong>CYBERNETICALLY ENHANCED WEB APPS</strong><br />
<img src="https://storage.googleapis.com/zenn-user-upload/9e2ad2d4a25b-20211222.png" alt="Svelteサイトイメージ" /><br />
<a target="_blank" rel="nofollow noopener" href="https://svelte.dev">Svelte公式サイト</a></p>
fkuMnk
tag:crieit.net,2005:PublicArticle/17388
2021-06-11T06:41:05+09:00
2021-06-11T06:41:05+09:00
https://crieit.net/posts/Svelte-PHP-REST-API
Svelte学習帳 PHP REST-API編
<h1 id="Svelte学習帳 PHP REST-API編"><a href="#Svelte%E5%AD%A6%E7%BF%92%E5%B8%B3+PHP+REST-API%E7%B7%A8">Svelte学習帳 PHP REST-API編</a></h1>
<h2 id="概要"><a href="#%E6%A6%82%E8%A6%81">概要</a></h2>
<ul>
<li>SvelteKitでWebアプリケーションを作ります</li>
<li>PHPでREST-APIを作ります</li>
<li>fetchで通信します</li>
<li>データベースに保存したり読み込んだりします</li>
</ul>
<h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2>
<p>これは、ローカル環境でREST-APIの練習をするサンプルコードです。<br />
SveltKitで作成したWebアプリケーションに表示されているパラメータを、REST-APIでデータベースに保存します。</p>
<p>以前に投稿した記事「続・コードを書いてステータス画面を表示する」の続編になっています。</p>
<p>参考:<a target="_blank" rel="nofollow noopener" href="https://zenn.dev/fkumnk/articles/ebadd01cd2ca83">続・コードを書いてステータス画面を表示する</a></p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3dokAjJAPj_KBHTNaeIM9dT541d7B0rDoxcvmH3OKnlKmOjA-_jjRPi01AI__PVLuJmvIuglv1GHLFjWZ3DK8qzSuDXo2avfBdIj5EDi7TV_3N4mVWbQuWweTSpWwxq6b7L7qjXs0nXwPqqZo1yPMCyZA=w1247-h627-no?authuser=0" alt="参考記事" /></p>
<h3 id="動作要件"><a href="#%E5%8B%95%E4%BD%9C%E8%A6%81%E4%BB%B6">動作要件</a></h3>
<ul>
<li>SvelteKitが動作すること</li>
<li>PHP ビルトインサーバーが動作すること</li>
<li>PHP Composerが動作すること</li>
</ul>
<h2 id="STEP00 準備します"><a href="#STEP00+%E6%BA%96%E5%82%99%E3%81%97%E3%81%BE%E3%81%99">STEP00 準備します</a></h2>
<p>ここでは2つのプロジェクトフォルダを作成します。</p>
<h3 id="SvelteKitのプロジェクトを作成する"><a href="#SvelteKit%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">SvelteKitのプロジェクトを作成する</a></h3>
<p>SvelteKitのプロジェクトを作成します。<br />
ここではプロジェクト名を</p>
<pre><code>svelte-rest-app
</code></pre>
<p>としています。</p>
<p>参考:<a target="_blank" rel="nofollow noopener" href="https://kit.svelte.dev/">SvelteKit • The fastest way to build Svelte apps</a></p>
<h3 id="PHPプロジェクトを作成する"><a href="#PHP%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">PHPプロジェクトを作成する</a></h3>
<p>svelte-rest-appと同じ階層に</p>
<pre><code>php-rest-app
</code></pre>
<p>というフォルダを作成します。</p>
<p>今回はPopcornというマイクロフレームワークを使用するので、Composerでインストールします。</p>
<p>参考:<a target="_blank" rel="nofollow noopener" href="https://github.com/popphp/popcorn">popphp/popcorn: Popcorn PHP REST Micro-Framework</a></p>
<h3 id="確認"><a href="#%E7%A2%BA%E8%AA%8D">確認</a></h3>
<p>サンプルプロジェクトはこういう感じになります。</p>
<p>確認:<a target="_blank" rel="nofollow noopener" href="https://github.com/hideki-masuoka/samplecode-svelte-rest-app/tree/Step00">samplecode-svelte-rest-app at Step00</a></p>
<h2 id="STEP01 パラメータを取得する"><a href="#STEP01+%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B">STEP01 パラメータを取得する</a></h2>
<p>Webアプリを作成して、アプリ内で使用するパラメータを取得する機能を追加します。</p>
<h3 id="Webアプリを作ります"><a href="#Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99">Webアプリを作ります</a></h3>
<p>/svelte-rest-app/src/routes/index.svelte を開きます。<br />
内容を消去して、Svelte REPLのサンプルコードに置き換えます。<br />
サンプルコード:<a target="_blank" rel="nofollow noopener" href="https://svelte.dev/repl/2ad1f0ae67b7406e8beee9a2efbceda3?version=3.37.0">IamStronger • REPL • Svelte</a></p>
<h3 id="パラメータ取得機能を作ります"><a href="#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E5%8F%96%E5%BE%97%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99">パラメータ取得機能を作ります</a></h3>
<p>scriptの内容に、fetchでパラメータを取得する機能を追記します。</p>
<pre><code class="JavaScript"><script>
// STEP01 onMountを呼び出します
import { beforeUpdate, onMount } from 'svelte';
let name = 'name';
let lv = 10;
let max_hp = 1000;
let hp = 80;
let max_mp = 10;
let mp = 8;
let agi = 5;
let tec = 2;
let str = 9;
let luc = 1;
let text = `I'm stronger.`;
beforeUpdate(()=>{
max_hp = lv * str;
max_mp = Math.round((lv * agi) / 2);
});
// STEP01 fetchでパラメータを取得する機能
const getParams = async () => {
const serverURL = 'http://localhost:8080/params';
const response = await fetch(
serverURL,
{
method: 'GET',
mode: 'cors',
credentials: 'omit'
}
);
return await response.json();
}
// STEP01 アプリマウント時に、取得したパラメータを変数に適用する処理
onMount(async ()=>{
let params = await getParams();
name = params.name;
lv = params.lv;
hp = params.hp;
mp = params.mp;
agi = params.agi;
tec = params.tec;
str = params.str;
luc = params.luc;
text = params.text;
});
</script>
</code></pre>
<p>参考:<a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch">Fetch の使用 - Web API | MDN</a></p>
<h3 id="Webアプリケーションに応答する機能を作ります"><a href="#Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E5%BF%9C%E7%AD%94%E3%81%99%E3%82%8B%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99">Webアプリケーションに応答する機能を作ります</a></h3>
<p>/php-rest-appフォルダに、publicフォルダを作成して、そこにindex.phpを作成します。</p>
<pre><code>/php-rest-app/public/index.php
</code></pre>
<p>パラメータを返す機能をindex.php内に作ります。</p>
<pre><code class="php"><?php
require_once '../vendor/autoload.php';
use Popcorn\Pop;
// STEP01 マイクロフレームワークの準備
$app = new Pop();
// STEP01 パラメータ取得に応答する機能を登録します
$app->get(
'/params/',
function () {
// STEP01 ローカル環境間でのアクセスを許可します
header('Access-Control-Allow-Origin: http://localhost:3000');
header('Access-Control-Allow-Headers: Origin, Content-Type');
$params = [
'name' => 'name2',
'lv' => '12',
'hp' => '90',
'mp' => '10',
'agi' => '6',
'tec' => '3',
'str' => '10',
'luc' => '2',
'text' => "I'm stronger2."
];
echo json_encode($params);
}
);
$app->run();
</code></pre>
<h3 id="ローカル環境で実行する"><a href="#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%92%B0%E5%A2%83%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">ローカル環境で実行する</a></h3>
<p>/php-rest-app/public/フォルダに移動して、サーバを起動します。</p>
<pre><code>php -S localhost:8080
</code></pre>
<p>/svelte-rest-app/フォルダに移動してアプリケーションを起動します。</p>
<p>パラメータの内容が書き換わっていれば成功です。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3el4glcnITHtpnTUvkG8yVzoyt1xWVbP32RB7ma4wQvx1_B_sGHMDVEitxtHkqEEOyUsVYVXW3rVRxGJV1t6xegDiT1K2dcHks2PudQicl72RP7ef-49wLTrAFR2klfCU6mxpG2YY2GmSgKjGjL1f3hMA=w372-h692-no?authuser=0" alt="STEP01確認画像" /></p>
<h3 id="確認"><a href="#%E7%A2%BA%E8%AA%8D">確認</a></h3>
<p>サンプルプロジェクトはこういう感じになります。</p>
<p>確認:<a target="_blank" rel="nofollow noopener" href="https://github.com/hideki-masuoka/samplecode-svelte-rest-app/tree/Step01">samplecode-svelte-rest-app at Step01</a></p>
<h2 id="STEP02 パラメータを送信する"><a href="#STEP02+%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B">STEP02 パラメータを送信する</a></h2>
<h3 id="パラメータ送信機能を作ります"><a href="#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E9%80%81%E4%BF%A1%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99">パラメータ送信機能を作ります</a></h3>
<p>/svelte-rest-app/src/routes/index.svelte を開きます。</p>
<p>scriptに送信機能を追記します。</p>
<pre><code class="JavaScript"><br />// STEP02 送信結果を受け取る変数
let message = false;
// STEP02 fetchでパラメータを送信する機能
const saveParams = async () => {
const serverURL = 'http://localhost:8080/saveparams';
const response = await fetch(
serverURL,
{
method: 'POST',
mode: 'cors',
credentials: 'omit',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: name,
lv: lv,
hp: hp,
mp: mp,
agi: agi,
tec: tec,
str: str,
luc: luc,
text: text
})
}
);
message = await response.json();
}
</code></pre>
<h3 id="送信ボタンを作ります"><a href="#%E9%80%81%E4%BF%A1%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99">送信ボタンを作ります</a></h3>
<p>textareaの下にパラメータを送信するボタンを追記します</p>
<pre><code class="HTML"><br>
<button on:click="{saveParams}">
SAVE
</button>
{#if message}
<br>
<strong>{message.message}</strong>
{/if}
</code></pre>
<h3 id="Webアプリケーションに応答する機能を作ります"><a href="#Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E5%BF%9C%E7%AD%94%E3%81%99%E3%82%8B%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99">Webアプリケーションに応答する機能を作ります</a></h3>
<p>/php-rest-app/public/index.phpを開きます</p>
<p>パラメータ送信に応答する機能を追記します。</p>
<pre><code class="PHP"><br />// STEP02 CORS対応処理
$app->options(
'/saveparams/',
function () {
header('Access-Control-Allow-Origin: http://localhost:3000');
header('Access-Control-Allow-Headers: Origin, Content-Type');
}
);
// STEP02 パラメータ送信に応答する機能を登録します。
$app->post(
'/saveparams/',
function () {
header('Access-Control-Allow-Origin: http://localhost:3000');
header('Access-Control-Allow-Headers: Origin, Content-Type');
// STEP02 受信確認メッセージを返します
echo json_encode(['message' => '受信しました']);
}
);
</code></pre>
<h3 id="ローカル環境で実行する"><a href="#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%92%B0%E5%A2%83%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">ローカル環境で実行する</a></h3>
<p>/php-rest-app/public/フォルダに移動して、サーバを起動します。</p>
<pre><code>php -S localhost:8080
</code></pre>
<p>/svelte-rest-app/フォルダに移動してアプリケーションを起動します。</p>
<p>SAVEボタンをクリックして、メッセージが返ってくれば成功です。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3fmpdOsAcskzAFzROsb95ROyjVToXI_l_7olcgIdadBvr8sfA9J7_hb0yoq4ljpnWoCv4Ko6sJlX19NP0kyMukHJhd1Jjvd8ED8CwD8BO9he7IHkI-sAOHaXzFK9v5numcSINyExhtkyrlbLFEVFBEi3g=w375-h180-no?authuser=0" alt="STEP02確認画像" /></p>
<h3 id="確認"><a href="#%E7%A2%BA%E8%AA%8D">確認</a></h3>
<p>サンプルプロジェクトはこういう感じになります。</p>
<p>確認:<a target="_blank" rel="nofollow noopener" href="https://github.com/hideki-masuoka/samplecode-svelte-rest-app/tree/Step02">samplecode-svelte-rest-app at Step02</a></p>
<h2 id="STEP03 パラメータを保存する"><a href="#STEP03+%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B">STEP03 パラメータを保存する</a></h2>
<h3 id="pop-httpをインストールします"><a href="#pop-http%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%BE%E3%81%99">pop-httpをインストールします</a></h3>
<p>/php-rest-appフォルダに移動します</p>
<p>今回はpop-httpというライブラリを使って、送信されたパラメータを受け取るのでComposerでインストールします。</p>
<p>参考:<a target="_blank" rel="nofollow noopener" href="https://github.com/popphp/pop-http">popphp/pop-http: Pop Http Component</a></p>
<h3 id="データベースを準備します"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E6%BA%96%E5%82%99%E3%81%97%E3%81%BE%E3%81%99">データベースを準備します</a></h3>
<p>/php-rest-app/public/index.phpを開きます。</p>
<p>フレームワークの準備処理の手前に、データベースを準備する処理を追記します。</p>
<pre><code class="php">// STEP03 データベースを準備します
$pdo = new PDO('sqlite:example.db');
$sql = <<< "SQL"
CREATE TABLE IF NOT EXISTS config (
param_id INTEGER PRIMARY KEY,
params TEXT
);
SQL;
$pdo->exec($sql);
</code></pre>
<p>参考:<br />
- <a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/pdo.construct.php">PHP: PDO::__construct - Manual</a><br />
- <a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/pdo.exec.php">PHP: PDO::exec - Manual</a></p>
<h3 id="パラメータをデータベースに保存します"><a href="#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%BE%E3%81%99">パラメータをデータベースに保存します</a></h3>
<p>パラメータ送信に応答する機能として、リクエストデータを受け取ってデータベースに保存する処理を追記します。</p>
<pre><code class="php">// STEP03 pop-httpでリクエストデータを受け取ります
$request = new \Pop\Http\Server\Request();
$params = $request->getParsedData();
$encoded_params = json_encode($params);
// STEP03 リクエストデータを保存します
$sql = <<< "SQL"
INSERT OR REPLACE INTO
config(param_id, params)
VALUES(1, :params);
SQL;
$pdo = new PDO('sqlite:example.db');
$sth = $pdo->prepare($sql);
$sth->bindParam(':params', $encoded_params);
$bool = $sth->execute();
$message = $bool ? '保存しました' : '保存できませんでした';
// STEP02 受信確認メッセージを返します
// STEP03 実行結果をメッセージとして返します
echo json_encode(['message' => $message]);
</code></pre>
<p>参考:<br />
- <a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/pdo.prepare.php">PHP: PDO::prepare - Manual</a><br />
- <a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/pdostatement.bindparam.php">PHP: PDOStatement::bindParam - Manual</a><br />
- <a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/pdostatement.execute.php">PHP: PDOStatement::execute - Manual</a></p>
<h3 id="ローカル環境で実行する"><a href="#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%92%B0%E5%A2%83%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">ローカル環境で実行する</a></h3>
<p>/php-rest-app/public/フォルダに移動して、サーバを起動します。</p>
<pre><code>php -S localhost:8080
</code></pre>
<p>/svelte-rest-app/フォルダに移動してアプリケーションを起動します。</p>
<p>SAVEボタンをクリックして、保存しましたメッセージが返ってくれば成功です。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3e8EBrroTKuhBmL4a6O1GMEnnzPT_0uIRlRO6UAMZQ86JQepAQuI6TDH2YmmYBCDCYxWDy_CSvinlRZ1spMDXPdYJCgFQbesRQBQ8-bBEsrdwvhBG-Ba6aHEm7jkWfNwWnbOray_CvmeYVSBBzu8fXI0A=w375-h180-no?authuser=0" alt="STEP03確認画像" /></p>
<h3 id="確認"><a href="#%E7%A2%BA%E8%AA%8D">確認</a></h3>
<p>サンプルプロジェクトはこういう感じになります。</p>
<p>確認:<a target="_blank" rel="nofollow noopener" href="https://github.com/hideki-masuoka/samplecode-svelte-rest-app/tree/Step03">samplecode-svelte-rest-app at Step03</a></p>
<h2 id="STEP04 保存したパラメータを取得する"><a href="#STEP04+%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%9F%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B">STEP04 保存したパラメータを取得する</a></h2>
<h3 id="取得するパラメータをデータベースの値に切り替えます"><a href="#%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E5%80%A4%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%BE%E3%81%99">取得するパラメータをデータベースの値に切り替えます</a></h3>
<p>/php-rest-app/public/index.phpを開きます。</p>
<p>パラメータ取得に応答する機能として、データベースから値を取得する機能を追記します。</p>
<pre><code class="php">// STEP04 データベースからパラメータを取得します
$sql = <<< 'SQL'
SELECT param_id, params
FROM config
WHERE (param_id = 1);
SQL;
$pdo = new PDO('sqlite:example.db');
$sth = $pdo->prepare($sql);
$sth->execute();
$db_data = $sth->fetchColumn(1);
// STEP04 取得したパラメータを返します
// STEP04 取得した結果がnullのときは、デフォルトデータを返します
$params = json_decode($db_data) ?? $params;
</code></pre>
<p>参考:<a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/pdostatement.fetchcolumn.php">PHP: PDOStatement::fetchColumn - Manual</a></p>
<h3 id="ローカル環境で実行する"><a href="#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%92%B0%E5%A2%83%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">ローカル環境で実行する</a></h3>
<p>/php-rest-app/public/フォルダに移動して、サーバを起動します。</p>
<pre><code>php -S localhost:8080
</code></pre>
<p>/svelte-rest-app/フォルダに移動してアプリケーションを起動します。</p>
<p>パラメータを変更してSAVEした後、ブラウザでアプリケーションを再読込します。SAVEしたパラメータが表示されれば成功です。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3c6YqXqBl6y4At1ZGYjEmfmnXfYaxN77JWFwMzKUY9T-UP01OG3FuPh12JUB9PmUPrZVkZbwREZ8E7nqv_-B_hVofU0Cd9usGVDwbQ6E_vyo-D6HKdB8cc4XLRUHzgb-VLTsjX7KcBZMVnexvWz6qwUDw=w383-h292-no?authuser=0" alt="STEP04確認画像" /></p>
<h3 id="確認"><a href="#%E7%A2%BA%E8%AA%8D">確認</a></h3>
<p>サンプルプロジェクトはこういう感じになります。</p>
<p>確認:<a target="_blank" rel="nofollow noopener" href="https://github.com/hideki-masuoka/samplecode-svelte-rest-app/tree/Step04">samplecode-svelte-rest-app at Step04</a></p>
<h2 id="STEP05 練習する"><a href="#STEP05+%E7%B7%B4%E7%BF%92%E3%81%99%E3%82%8B">STEP05 練習する</a></h2>
<p>これは、ローカル環境で練習するためのサンプルプロジェクトです。<br />
実際のプロダクトでは、ここで使用したライブラリや手法を自由に扱えるようになるまで練習して得た経験を活用してみてください。</p>
fkuMnk