はじめてのPHPプロフェッショナル開発(作成仕様書カテゴリー)の作成例イメージ画像
カテゴリー | 作成仕様書 |
---|---|
記事登録日 | 2020-01-05 13:21:39 |
テクノロジー | CakePHP | フレームワーク | |
概要 | https://www.shuwasystem.co.jp/book/9784798047492.html Webサイト開発で人気のPHPは、初心者にも扱いやすく、Web系開発と相性の良いプログラミング言語です。2015年のPHP7リリース以降、モダンな開発言語が持つ機能や特徴を取り込み、大幅なパフォーマンスの向上を実現しました。本書は、PHPの基本から開発現場で必須の設計やコードレビュー、継続的インテグレーションなど、実践的な技法も余すことなく解説しました。PHP開発者になるために知っておきたい必須知識が満載です。 Part01 導入編 Chapter01 進化するPHP 01-01 PHPの歴史 1 「Personal Home Page Tools」と呼ばれるツール群として誕生した 2 根本的なデザインのやり直しと、拡張性を実現した3.0が今に至る「PHP: Hypertext Preprocessor」の始まり 3 現在の最新バージョンはPHP7で、前バージョンのPHP5から大幅なパフォーマンス向上が実施された 01-02 PHPの特徴 1 PHPは、Webアプリケーションの領域にとどまらずCLIやバッチ処理にも利用できるプログラミング言語 2 「プログラミング初心者でも動的なWebサイトを作りやすい」という側面もあるが、複雑・大規模な開発にも活用されている 3 世間的なトレンドや、他言語のコンセプトを導入しながらモダンなプログラミング言語として成長している Chapter02 PHPのエコシステム 02-01 モダンなPHPを支えるコミュニティの力 1 開発の現場において完全に0からの実装をすることは滅多になく、多くは既存のライブラリを利用する 2 標準的なパッケージ管理の仕組みであるComposerによって、いろいろな「パーツ」の導入のための手間が削減された 3 世の中に溢れるライブラリの相互性を担保し、再利用性を高めていこうという流れの1つがPSR 02-02 PHP-FIGとPSR 1 PHP-FIGは、元々はPHP本体に対しての提言を行うために集ったグループが前身となっている 2 PSRには、スタイルガイドや命名規則、特定領域のコンポーネントにおける実装方針(Interface)が含まれる 3 強制力のある標準ではないが、PSRを知っておくことで他者のソフトウェアの読解・導入に役立つ場面がある 02-03 PHPのパッケージ管理 1 Webアプリケーションインフラや運用スタイルの進化にあわせて、「使いやすいパッケージ管理」の仕組みは変化していく 2 今日においてはComposerを利用することが一般的 3 PEARと比較して、Composerの提供する管理手法は現代的なWebアプリケーション開発と相性が良いと言える 02-04 PHPのアプリケーションフレームワーク 1 Webフレームワークはフルスタック型のものではなく、マイクロ型やコンポーネント志向のものも有力な選択肢 2 一概に「Webアプリケーション」といっても要件は多岐にわたり、ケースバイケースの判断が不可欠 3 開発メンバーの技量や経験、要求されるパフォーマンス、保守性について考慮すべき Chapter03 PHPをはじめよう 03-01 エディタ 1 「文字コードの変更」と「シンタックスハイライト」が使えるエディタを選ぼう 2 IDEを最大限活用して開発効率を上げることが重要 3 エディタ・IDEは様々なものをまずは試してみて手に馴染むものを使おう 03-02 DockerでPHPの開発環境を整える 1 Dockerは高速で軽量な次世代の仮想化技術 2 Dockerを使うとサーバーの各種設定やミドルウェアもコード化できる 3 DockerをインストールしてPHPを試す環境を簡単に作る方法 Chapter04 モダンPHPの文法と基礎文法 04-01 基本的な構文 1 PHPはコードが開始タグ で囲まれている 2 PHPをコマンドラインから実行する方法 3 PHPをHTMLの中に組み込んで使う方法 04-02 型と演算 1 PHPで「数値」「文字列」「論理値」を表現する方法 2 比較演算を行うときに気をつけたい「暗黙的な型変換」 3 「添字配列」と「連想配列」の使い方 04-03 分岐処理 1 if文は「◯◯のときは△△し、□□のときは◇◇する」といった分岐処理で使う 2 条件式を複数設定したい場合は elseif を使う 3 switch文を使う場合は緩やかな比較が行われることに気をつける 04-04 繰り返し処理 1 while文は回数が決まっていない繰り返し処理によく使われる 2 for文は指定した回数だけ繰り返し処理が実行される 3 foreach文は配列とオブジェクト専用の繰り返し処理を実行する構文 04-05 関数 1 関数を使うと何らかの連続した処理を1つにまとめることができる 2 関数を使うと再利用性を高めたり、可読性を上げたりすることができる 3 PHPには最初から定義されている組み込みの関数がとても充実している 04-06 PHP7の新機能 1 型宣言機能が強化され、数値や文字列などのスカラ値の型宣言に対応した 2 関数の戻り値の型宣言が書けるようになった 3 致命的エラーを例外としてハンドリングできるようになった Part02 入門編 Chapter05 チームのための開発環境構築 05-01 開発環境のプラットフォーム 1 本格的な開発用途としてホストで直接開発を行うシーンは少なくなってきている 2 仮想マシンで開発する場合はリソースの逼迫や起動の遅さ、管理・運用面での課題がある 3 コンテナでの開発はこれまでの課題を克服した新しい開発環境 05-02 Dockerで開発環境を立てる際のポイント 1 初めてDockerを触るときはDocker Hubにある公式イメージを使う 2 複数のコンテナの管理・実行にはDocker Composeが効果的 3 Dockerfileを使って独自のDockerイメージを作る方法 05-03 実践的なアプリケーション開発のための環境を作る 1 PHPの公式イメージをベースにCakePHPの開発環境を作る方法 2 コンテナでMySQLを使う方法 3 CakePHPからMySQLに接続する方法 Chapter06 設計から始める 06-01 設計の重要性 1 アジャイル開発においても設計は重要 2 設計が不十分だと開発するものが曖昧になってしまう 3 設計レベルの負債は解消が難しい 06-02 要件定義をしよう 1 最初は大まかな粒度で必要な要件を整理する 2 必要でない要件を併せて洗い出す 3 画面設計は実際にスケッチを書く 06-03 設計時の注意 1 設計時に全ての仕様や課題を洗い出すのは難しい 2 複数人で開発する場合は使う言葉を統一する 3 フレームワークやデータベースは作りたいものに対する手段の一つ Chapter07 CakePHPを使ってみよう 07-01 実装を進める前に 1 開発環境構築の章で作成した環境を利用する 2 様々な技術スタックを利用するがCakePHPを中心に解説する 3 紙面に掲載するコードはGitHubからダウンロード可能 07-02 CakePHPについて 1 MVCはプログラムを「モデル」、「ビュー」、「コントローラー」という要素に分ける設計手法 2 「設計より規約」を重視することで、プログラムのコード量を減らすことができる 3 CakePHPにはbakeやmigrationなど便利な機能がたくさんある 07-03 テーブル設計とURL設計 1 テーブル設計時はテーブル同士の関係に注目する 2 URLは一貫性が大切 3 どちらもCakePHPの規約に従ったほうが開発が楽になる Chapter08 質問と回答機能の実装 08-01 質問一覧画面の実装 1 テーブル間の連携はアソシエーション機能を利用する 2 paginate() メソッドでページングされた情報を取得できる 3 CakePHPでは明示的にエスケープ処理を記述する必要がある 08-02 質問投稿画面の実装 1 Formヘルパーを利用すると、簡単にフォームを作成することができる 2 save() メソッドでデータベースにレコードを登録することができる 3 一回だけ通知したいメッセージを表示する場合は、Flashコンポーネントを利用する 08-03 質問詳細画面の実装 1 loadModel() メソッドを利用することでデフォルト外のモデルを利用することができる 2 get() メソッドで存在しないIDを指定した場合は404エラーが発生する 3 仕様として件数が制限されている場合は、全件取得しても問題ない 08-04 回答投稿機能の実装 1 UI上不要な場合はフォームを表示させない 2 マジックナンバーは定数として定義しておくのが良い 3 事前に行っておきたい処理は beforeFilter() メソッド内に記述する 08-05 質問 / 回答削除機能の実装 1 delete() メソッドを利用することでレコードを削除することができる 2 質問削除と回答削除のコードの微妙な違いを意識する 3 最終的にユーザー管理機能と連携する必要があるので @TODO コメントを残しておく 08-06 テーブルクラスの活用 1 作ったら終わりではなく常にもっと良くできないかを考えることが重要 2 コントローラークラスが長くなってきたら、テーブルクラスに切り出すことを検討する 3 保守性の高いコードを書くためには、各クラスの責務を意識することが大切 08-07 バリデーションの実装 1 運用やセキュリティ上の観点からバリデーションの実装は非常に重要 2 CakePHPではモデル層でバリデーションの定義を行う 3 クライアント側だけでなくサーバー側でもバリデーションを行う必要がある Chapter09 ユーザー管理機能の実装 09-01 ユーザー登録画面の実装 1 パスワードを保存する際は平文ではなくハッシュ化して保存する必要がある 2 Entityクラスのセッターメソッドを利用しながら、保存時にハッシュ化を行う 3 入力間違いを防ぐために、フォームではパスワード確認用のフィールドを用意する 09-02 ログイン画面の実装 1 認証やログインの処理を行うにはAuthコンポーネントを利用する 2 Authコンポーネントの設定はAppControllerクラスで定義する 3 identify() メソッドでログイン時の認証処理を行う 09-03 ログアウト機能の実装 1 ログイン処理と同様にログアウト処理もAuthコンポーネントを利用する 2 logout() メソッドは戻り値としてログアウト時のリダイレクト情報を返す 3 ログイン判定はセッションにユーザーIDが存在するかどうかで判断する 09-04 その他のユーザー管理画面の実装 1 save() メソッドは isNew() メソッドがfalseの場合に更新処理になる 2 ユーザー編集画面はpostメソッドではなく、putメソッドでリクエストを受ける 3 パスワードは独自のルールが必要なため、カスタムバリデーションを定義する 09-05 質問 / 回答機能をユーザー情報と連携する 1 質問と回答の投稿をする際、動的にユーザーIDを取得する 2 どのユーザーがその質問や回答を投稿したかが分かるようにする 3 投稿した本人しか質問と回答を削除できないようにする 09-06 機能改善をしてみよう! 1 webサービスは絶え間ない改善が必要 2 例えば、いいね機能を実装する 3 あなただけのPHP 質問広場をつくりましょう! Chapter10 テストコードを書く 10-01 本書で扱うテストについて 1 テストは品質を保つ上で非常に重要 2 本書ではユニットテストにフォーカスする 3 題材としてPHP 質問広場で実装したQuestionsControllerクラスを取り上げる 10-02 ユニットテストの必要性 1 ユニットテストは小さなコードの振る舞いを検証するためのテスト 2 PHPではPHPUnitというユニットテストツールを利用することが多い 3 動作確認のコストを削減できるなどユニットテストには多くのメリットがある 10-03 CakePHPにおけるテスト 1 CakePHPにはテストツールとして、PHPUnitがビルトインされている 2 テスト時はテスト専用のデータベースを使用する 3 テストコードは test ディレクトリ配下に作成する 10-04 テストの準備 1 フィクスチャーとはテスト実行時にテンポラリなデータをロードするための仕組み 2 フィクスチャーはbakeコマンドで作成することもできる 3 各テストクラスで必要なフィクスチャーを記述する 10-05 テストコードの書き方を学ぶ 1 テストコードを書く際は「AAA」を意識する 2 基本的には1つのテストメソッドにつき、1つのテストケースを書く 3 正常系だけではなく、異常系のテストもしっかりと行う 10-06 テストコードはいつ書くべきか? 1 基本的にアプリケーションコードとテストコードはセット 2 テストが書きづらい時はアプリケーションコードの設計に問題がある場合が多い 3 PHP 質問広場の別のアプリケーションコードのテストも是非書いてみましょう。 Part03 実践編 Chapter11 チーム開発の現場 11-01 個人開発とチーム開発の違い 1 チーム開発では「見える化」の必要がある 2 チーム開発が上手くいくかどうかはコミュニケーションによって左右される 3 GitHubとSlackを導入することでチーム開発の基盤を整えることができる 11-02 GitHubを使った課題の「見える化」 1 GitHubではIssue機能を利用することで課題を管理できる 2 Issueを書く際は必要に応じてフォーマットを用意する 3 コードも課題もGitHubで管理することでツールの学習コストを削減できる 11-03 Slackを使った日々のコミュニケーション 1 チャットはメールに比べると即時性が優れている 2 Slackはチャンネルという単位でコミュニケーションを取る 3 Slackは外部サービスとの連携でより便利に使うことができる 11-04 ツールの選定方法 1 ツールを使うこと自体が目的にならないようにする必要がある 2 ベストなツールは組織のフェーズや規模によって異なる 3 ツール選定時に重要なのはそれによって何を解決したいのかを考えること Chapter12 Pull Request 駆動によるコードレビュー 12-01 コードレビューの必要性 1 コードレビューの一番の目的はコードの品質を高めること 2 コードレビューを行うことでシステムの属人性を減らすことができる 3 コードレビューを行うことで個々人の技術力を向上することができる 12-02 Pull Requestを利用したコードレビューの方法 1 Pull Requestとはコードなどの変更内容の確認を他のメンバーに依頼すること 2 コードレビューを依頼する時は変更内容をきちんとレビュアーに伝える必要がある 3 Pull Requestを利用することでコードレビューの流れを確立することができる 12-03 コードレビューをしてみよう 1 まずは不具合があるかどうかを必ずレビューする 2 その上で可読性やパフォーマンスなどの観点からレビューを行う 3 レビュー対象は人ではなくコードであることを意識する Chapter13 開発に役立つツール 13-01 なぜツールを使うのか 1 各種の自動化ツールを導入することによって、反復的な作業を自動化することができる 2 適用対象の領域におけるケアレスミスや見落としがなくなり、より安心感をもって開発に取り組める 3 「誰がやっても同じ結果をもたらす」ことは、チームのベースとなるルールの設定や実施ハードルを下げる 13-02 PHP_CodeSniffer:コーディング規約チェックツール 1 Composerによるインストールと、簡単なルールセット設定ファイルの設置によって導入が可能 2 PSR準拠のルールや、アプリケーションフレームワークの用意しているルールセットがあれば簡単に利用できる 3 CIやエディタの機能を利用して実行を自動化するのがおすすめ 13-03 PHPStan: コード解析ツール 1 静的解析ツールは、実際にアプリケーションを動かす前に潜在的な不具合を発見する 2 PHPStanは、今日において最も有名な(静的)解析ツールのうちの1つ 3 柔軟な設定と予めデザインされたチェックレベルによって、導入ハードルを抑えて利用できる Chapter14 継続的インテグレーション 14-01 なぜ継続的インテグレーションが必要なのか 1 継続的インテグレーションとは、新しい変更を適用する前に、予め規定されたチェックを自動的に行うようにすること 2 自動化によってチェックの実施頻度を高めて、「問題がない状態」を保ちつづけることが目的 3 継続的インテグレーションの導入によって、開発における作業者の安心感を高める 14-02 CIツールとは 1 オンプレミス型を利用するか、クラウド型のサービスを利用するか 2 ユーザーが処理スクリプトを定義して任意の処理を実行するものや、特定機能の提供を行う特化型CIがある 3 チームにとって必要なもの、より良い開発を行うための助けとなるものを選定しよう 14-03 CIを利用してみる 1 アカウント作成とソースコード管理ツール(GitHubやGitLabなど)の連携、設定ファイル( .travis.yml )の設置が必要 2 基本的な使い方であれば、とても簡単に導入することが可能 3 ジョブの実行はいくつかのフェーズに分かれる。ライフサイクルの理解がTravis CIを使いこなすための道 Chapter15 デプロイの自動化 15-01 Webアプリケーションの公開 1 クラウドサービスを使うことで簡単にサービスを公開できる 2 Herokuを使うと30分程でサービス公開が可能 3 AWSを使うことで自由度高くサービス公開が可能 15-02 ソフトウェアのデプロイメントサイクル 1 各開発者が各々自由に使える開発環境 2 プロダクションデプロイ前の最終チェックに使われるステージング環境 3 ユーザに対して実際にサービスを提供するプロダクション環境 15-03 デプロイ自動化のメリット 1 誰がやっても同じデプロイ結果を得ることができる 2 小さい単位でのデプロイが可能に 3 デプロイの自動化が安定したサービス提供につながる 15-04 コンテナベースのビルド&デプロイ 1 コンテナ技術により開発者もインフラ変更をコードベースで行うことができる 2 イミュータブルインフラストラクチャーによるシンプルなインフラ更新の実現 3 コンテナ技術でOSからアプリケーションまでパッケージング化 15-05 コンテナのデプロイサイクル 1 Dockerイメージのビルド 2 Dockerリポジトリへのアップロード 3 コンテナの入替え 15-06 コンテナのデプロイを楽にするオーケストレーションツール 1 コンテナのデプロイにはオーケストレーションツールが欠かせない 2 コンテナオーケストレーションツールはコンテナの運用を楽にする多岐な役割を提供してくれる 3 システム要件にあったものを選択して導入することが重要 Part04 発展編 Chapter16 障害と向き合う 16-01 障害は突然やってくる 1 障害のレベルや要因に応じて、様々な故障がある。肝心なのは「適切に対処し、問題をとりのぞく」こと 2 提供サービスが不安定なのは、ユーザーだけでなく、開発や運用を行うメンバーにとっても強いストレスになる 16-02 障害についての重要な考え方 1 開発やリリースのフローの中で障害の芽を摘むような取り組みを実施する 2 障害が起きたことを「検知」できるようにし、「問題特定」「迅速な一次対応」ができるように備える 3 障害の原因・内容・対応を、しっかりと「チームの資産」とできるように形に残す 16-03 障害と向き合うためのツール 1 監視やモニタリングのツールは、様々なレイヤーのものを目的に合わせ、組み合わせて利用するのが効果的 2 アラートシステムを、チームの規模やレベルに応じて適切なものを導入し、運用をデザインする 3 有事の際に「すぐに状況を調べられるか」が重要。柔軟に利用しやすいロギングツールを用意する Chapter17 SQLチューニング 17-01 なぜSQLチューニングが必要なのか 1 SQLを使って、データベースからデータを引き出せる 2 SQLの実行速度がアプリケーションのパフォーマンスに直結する 3 SQLチューニングには知識が必要 17-02 遅いSQLのパターン 1 遅いSQLには複数のパターンがある 2 開発時に気づける単体で遅いSQL 3 データ量の増加に応じて生じる遅いSQL 17-03 SQLチューニング 1 なぜインデックスを使うとSQLが速くなるのか 2 効果の高いインデックスについて理解する 3 N+1問題とは何かを理解する 17-04 遅いクエリを検出する方法 1 実行計画でSQLがどのようなデータアクセスをするのかを見ることができる 2 EXPLAIN句の使い方を理解する 3 インデックス付与により実行計画がどう変わるかを理解する Chapter18 PHPとセキュリティ 18-01 セキュリティの基礎知識 1 脆弱性とは攻撃に利用できる欠陥・バグのこと 2 脆弱性の概要や原因、対策をしっかり理解することが重要 3 セキュリティを深く学ぶ方法 18-02 SQLインジェクション攻撃 1 SQLインジェクション攻撃によって意図しないSQLが実行される 2 「プリペアドステートメント」でSQLインジェクション対策 3 CakePHPではORMのメソッドを使う 18-03 XSS攻撃(クロスサイトスクリプティング攻撃) 1 XSS攻撃によって画面の書き換えやなりすましが起こる 2 「文字エンコーディングの指定」と「表示する際のエスケープの徹底」でXSS対策 3 CakePHPでエスケープするときはラッパー関数 h() を使う 18-04 CSRF攻撃(クロスサイトリクエストフォージェリ攻撃) 1 CSRF攻撃によって被害ユーザーの権限で意図しない処理が実行される 2 「トークンを使った正規リクエストの確認」でCSRF対策 3 CakePHPではCsrfProtectionMiddlewareクラスを使う Chapter19 外の世界に飛び出そう 19-01 OSSへの貢献 1 昨今のシステム開発はOSSなしには成立しない 2 最初にコントリビュートする時はtypoやドキュメントの修正がお勧め 3 自作ライブラリを公開する時はConvenience、Clearness、Continuityを意識する 19-02 最新情報のキャッチアップ 1 フレームワークのGitHubリポジトリを見ることで最新の動向を掴むことができる 2 勉強会に参加する場合はポータルサイトを利用すると便利 3 登壇をするとこれまで得た自身の知識を強化することができる 19-03 更にその先へ 1 外の世界に行くだけでは意味がない 2 エンジニアの本分はコードで世界をより良くしていくこと 3 目的意識さえあれば、外の世界には成長の機会がたくさんある |
参照URL | |
SNS |