Udemy「PHPからLaravelまでサーバーサイドをとことんやってみよう」をサラッとレビュー 前編

code

なかなか最終目標の説明がないので「何をするのか?」がわからない講座でしたが、最終的にはLaravelを使って“ひとことSNS風アプリ”を作ります。「Laravelって聞いたことあるけど…何やるの?」という方にはおすすめできる講座だと思います。この講座の良さを少しでもご紹介出来たら幸いです。実際に使用されるコードも紹介しますが、コンテンツを侵害する意図はありません。

約12時間の講座ですが、書きながら動かしながらなのでもっと時間はかかることが予想されます。説明は聞き取りやすくわかりやすくバックエンドの完全初心者の方でも取り組めるかと思いますが…内容的にも少し難しいので他のバックエンド講座を1つ終えてからの方が理解しやすいはずです。ともすたさんの「PHP+MySQL サーバーサイド入門」の方が易しいですが、Laravelは登場しないので「Laravelを体験してみたい」という方はこちらの講座を受講されるのがいいでしょう。

Sec1 PHPの基礎

初めにUdemyの使い方から本講座の概要を簡単に説明してますが、この時点ではなんのことかわからなくても構いません。とにかくUdemyに限らずこういった教材は早く1周目を終えてしまうことが大切かなと最近感じます。”3”の1:58~にあるようにフレームワークのメリットは「よく使う機能が用意してある」点にあり、よく聞く”車輪の再発明”を防いでスピードアップを手助けしてくれますが、かと言ってどういった機能が用意してあるかがわからないためとりあえず1周目をサラッと終えてしまうことが大事なんです。

”4”の開発環境説明で0:32~「WindowsはXAMPP」と言われますが、MAMPでも問題なく動きますし、色々なページを見てもMAMPの方が情報量も多く主流かなという印象です。「PHPのインストール」という文言を目にすることもあるかと思いますが、MAMPの“P”がPHPのことであり、MAMPをインストールした時点でPHPを使えるのでご安心を。ここでよくわからない「JavaScriptやCSSは新しい書き方が増えてきているのでNode.jsは必須」という説明が…Node.jsで調べると「サーバーサイドで動かせるJavaScript・ブラウザを使わない・言語ではなく処理の話」などこのNode.jsは1周目終えた段階では何のことやら…というかNode.jsをインストールしなくても本講座は最後まで問題無く完走できます。

“5”からいよいよコードを書きます。説明通りですが、最後のPHPだけのファイルの時だけ「PHPの閉じ ?> はなくてもいい」これは初めて聞いたかな、HTMLと合わせて書くときは<?php ?>で書くそうです。というか ?> くらい省略したいか?”8”PHPでは変数や文字列の連結を「+」ではなく「.」で表しますが後の足し算とは区別されます。”10”複雑な配列の書き方もこの後出てきます。

$array_2 = [
  [‘赤’, ‘青’, ‘黄’],
  [‘緑’, ‘紫’, ‘黒’],
];
echo $array_2[1][2];

これで「黒」を出力できます。データを扱うバックエンドなのでこうした「配列の中に配列」もイメージできるようにしましょう。”13”では複雑な連想配列もあり

$array_member_2 = [
  ‘本田’ => [
    ‘height’ => 170,
    ‘hobby’ => ‘’サッカー”
],
  ‘香川’ => [
    ‘height’ => 168,
    ‘hobby’ => ‘’うどん”
],
];
echo $array_member_2[‘香川’][‘height’];

これで「168」が出力されます。さらに1組・2組と階層を深めますが、書き方は同じです。”14”では演算子、先ほどの「.」との違いですが

$test_1 = 2;
$test_2 = 3;
$test_3 = $test_1 + $test_2;
echo $test_3

これで「5」が出力され、連結させ「23」としたい場合は$test_3 = $test_1 . $test_2;とします。”15”if文ですがそれより「==」「===」の違いも大事でして「==」でも一致かどうか判定するのですが、「===」は型も同じか判定します。今はまだ実感できないですが、プログラミングは複雑になるほど型にもこだわるようになるそうです。“18”からforeach, for文, whileなど出ますが、他の言語とほぼ同じなのですんなり理解できるかと思います。”20”case 1;など使う switch文はあまり使われないけど一応説明されますが、やはり1つずつbreak;を書くのが面倒くさいですよね。

“22”のユーザー定義関数の流れをよ~く理解しておく必要がありますので、繰り返し見ておきましょう。本講座ではそこまで複雑な関数を使う場面はありませんが、JavaScriptが絡むと関数は途端に難しくなり「この引数は何だ?」と迷子になります。”23”からあらかじめ用意されている組み込み関数ですが、全部は覚えられないので“よく使う”ものだけ解説されます。この“よく使う”も実際に様々なプロジェクトを経験しないと実感できないので結局数をこなしましょう。

$text = ‘abc’;
echo strlen($text);

これで「3」と出力されます。この文字数を数えるstrlen()が自分で定義したものではなくPHPにあらかじめ設定してある関数というわけです。

$str = ‘文字列を置換します’;
echo str_replace(‘置換’, ‘ちかん’, $str);

これで「文字列をちかんします」が出力され$strの置換をちかんに置き換えています。「こういうのもあるんだ~」を知らないと使えないですよね。”25”ではpreg_matchで正規表現を判定しますが、郵便番号やメールアドレス“かどうか”を調べるのに使うためバックエンドでは名前くらいは知っておいた方がいいでしょう。”27”で関数の名前付けですがcheckPostalCode()の様に単語のつなぎ目を大文字にするのがcamelCaseでcheck_postal_code()と「 _ 」でつなぐのがsnakeCaseと言うそうです。両方よく見る機会がありましたがちゃんと名前があったんですね。

“29”ファイルの読み込み require()はエラーで処理が止まり、include()は警告が出る、これも違いがちゃんとありました。他の言語ではどうなのか?requireの方が間違えた箇所がわかりやすいようです。

Sec2 お問い合わせフォーム

“33”からフォームを作ります。まずはmethod=”GET”でURLに現れる

if(!empty($_GET[‘your_name’])){
  echo $_GET[‘your_name’];
}

これでGETのyour_nameがあったら(空でなかったら)表示になりますが…やはりバックエンドは文字にしにくい。formの方まで書いていると長くなりすぎるので…ポイントだけまとめます。POST通信にするとアドレスバーに入力した情報は表示されずパスワードなどはこちらを使います。”34”でもっと複雑な画面の場合はファイルを分けて作成しますが、今回は入力・確認・完了画面を$pageFlagという関数の値1,2,3で振り分けています。type=”hidden”がでてきましたね、これが厄介…通信し画面が切り替わった時に$_GET・POSTの中身が消えてしまうので入力されたデータをキープする意味も込めて

<input type=”hidden” name=”your_name” value=”<?php echo $_POST[‘your_name’] ; ?>”>

次の”35”の戻るボタンを押すと自分で入力した内容を再び表示するためhiddenで送られてきていた値を入力欄に反映させます。

<input type=”text” name=”your_name” value=” <?php if(!empty($_POST[‘your_name’])){ echo $_POST[‘your_name’] ; } ?>”>

このif文を書かないと最初に入力画面にアクセスした際に「POSTに何も入ってないよ」とエラー文が出ます。一回渡した値を戻るボタン後の再入力のため「こっそりhiddenで」返してもらう、というイメージです。

“36”バックエンドはセキュリティの問題も考えなくてはいけません。「PHP+MySQLサーバーサイド入門」でも出てきましたがhtmlspecialcharsでサニタイズ(消毒)するというイメージですがhtmlspecialchars($str, ENT_QUOTES, ‘UTF-8’)でこれはお決まりの文言になるようでそれを本講座ではfuncion h($str)という関数にあらかじめ定義しておいて使用します。これで入力欄に悪意のあるJavaScriptを仕込んだとしても「<」や「’」が文字列として扱われJavaScriptとしての効力を発揮できなくなります。

“37”フォームセキュリティ フォームに入力したら他のページで爆破予告などに変換されてしまうなど入力内容が乗っ取られるCSRFを防ぐために「偽物のinputか本物のinputから内容なのか」を見極める必要があり、そのため暗号化した合言葉を作成します。session_start();でセッションを使えるようにしてから入力画面で

<?php
if(!isset($_SESSION[‘csrfToken’])){
  $csrfToken = bin2hex(random_bytes(32));
  $_SESSION[‘csrfToken’] = $csrfToken;
}
$token = $_SESSION[‘csrfToken’;]
?>

少し流れがわかりにくいですが、作成した合言葉を$csrfTokenに入れ、それを$_SESSIONに入れ、それがなかった時だけ作ってね、としたうえで$tokenに入れます。これもhiddenのvalue=”<?php echo $token ?>”で飛ばし、確認画面・完了画面で

<?php if($_POST[‘csrf’] === $_SESSION[‘csrfToken’]): ?>

と書くことで「POSTフォームのhiddenで送られてきたcsrfとSESSIONで送られてきたcsrfToken」が同じかどうかを判定しています。両方とも画面に表示はされていませんが、次の画面に値を送っていたんですね。加えて完了画面では

<?php unset($_SESSION[‘csrfToken’]); ?>

で合言葉をリセットする形になり、もう一度入力画面から操作したときには別の合言葉が作られセキュリティ上安全なシステムになりました。

“38”からバリデーションチェックを実装しますが、全てを文字にするのは無理なので…“40”の

<?php if(!empty($errors) && !empty($_POST[‘btn_confirm’]) ) : ?>
<?php echo ‘<ul>’; ?>
<?php
foreach($errors as $error) {
  echo ‘<li>’ . $error . ‘</li>’;
}
?>
<?php echo ‘</ul>’; ?>
<?php endif; ?>

これでエラーがあり、確認ボタンが押されたら、エラーそれぞれをリストで表示してね。ができました。こういったエラー文を手書きで書いていますが後でLaravelを使う時には既にエラー文まで用意してあり、希望によってそのエラー文も「必須です」から「入力してください」に変更することもできます。本講座の良くない点として「今何してる?ゴールは?」の説明が足りない点が挙げられ、「ここは後でもっと簡単にできますが、今は手書きで進めます」や「Sec2”40-41”で手書きのエラー文がLaravelではこんなに簡単に」などの前後があるとよかったかなと思います。

“44”WordPressでも登場したベーシック認証です。初めにtest.phpを作りパスと暗号化されたパスワードを調べます。echo __FILE__;で現在のファイトの位置が~/~/test.phpになるので最後を~/~/.htpasswdに変えればパスワードがある位置を示すことになり.htaccessファイルに記載します。echo (password_hash(‘password123’, PASSWORD_BCRYPT));で「password123」を暗号化したものが表示されるので.htpasswdファイルを作ってそこに記載します。

.htaccessファイルが

AuthType Basic
AuthName “IDとパスワードを入力してください”
AuthUserFile ~/~/.htpasswd
require valid-user

.htpasswdファイルが

admin: 「password123」を暗号化したもの

これでユーザー名がadminパスワードがpassword123になりました。これを入力しないとtest.phpに入れなくなりベーシック認証がかかりました。

“45”file_get_contentsで読み込み、file_put_contentsで書き込み、ですがこれも本講座では使わないのでサラッと聞けばいいです。

長くなりますので、続きは後半へ

コメント

タイトルとURLをコピーしました